我太累了,不想在两天内搜索这个问题,但我得到了错误的答案,我实现了 RecyclerView 并且效果很好,但是我的 RecycleView 有很多项目,例如照片和视频(例如 Instagram)。这意味着我的适配器将为所有项目调用 onBindViewHolder 以开始下载和加载图像和视频。但 RecycleView 只是在项目可见时(滚动显示它)为每个项目调用 onBindViewHolder 。不可能 ?如果不是的话,Instagram 如何能做到这一点。注意:我不想使用数据库来保存图像和视频
@Override
public void onBindViewHolder(RecyclerView.ViewHolder h, int position) {
Log.e("position",position+" ");
thread t = new Thread(new Runnable(){
public void run(){
Bitmap bitmap = downloadPhoto();//it mean photo downloaded and converted to Bitmap
runOnUiThread(new Runnable(){
holder.imageView.setImageBitmap(bitmap);
));
}
});
t.start();
}
您可以尝试将
recyclerview
嵌入嵌套滚动视图中,并且不要忘记禁用 scrollview
的嵌套 recyclerview
。这样,所有项目都会立即加载,即使它违反了 recyclerview
的目的。
虽然我不建议你使用这个“解决方案”,因为它破坏了使用 RecyclerView 的初衷,但可以让 RecyclerView 一次为每个项目调用 onBindViewHolder。为了让它工作,只需将 RecyclerView 设置在 NestedScrollView 中即可。
正如您所描述的,您只想在该项目可见时加载照片。事实上,
RecyclerView
适配器只会在项目出现(可见)时调用onBindViewHolder
,这样您就可以开始下载照片,然后在照片准备好时更新 UI。现在您不必一次加载所有项目的照片,只需在需要时加载即可。
ps:如果知道该项目的照片网址,您可以使用
Glide
或Picasso
库。
尝试在滚动之前加载所有图像网址
listItem.forEach{ imageUrl ->
val request = ImageRequest.Builder(context)
.data(imageUrl)
.build()
context.imageLoader.enqueue(request)
}