android-recyclerview - ImageView 在 RecyclerView 中离开屏幕后似乎就被回收了
问题描述
我刚开始使用 RecyclerView 来显示一些包含 ImageView 和 TextView 的行。当我打开屏幕时,一切都正确显示。如果我快速滚动到列表底部然后快速备份没有问题。但是,一旦我慢慢向下滚动以显示下一行并且第一行不再显示,向上滚动将显示一个黑色方块而不是我的位图。
我认为在向上滚动时会再次调用 onBindViewHolder() 但这仅在滚动 3 行后才会发生。所以看起来 RecyclerView 正在预取一些行
我尝试调用 setItemPrefetchEnabled(false); 在 layoutManager 或 setInitialPrefetchItemCount(0) 上;但它不会改变任何东西
知道发生了什么以及如何解决这个问题吗?
我正在做一个戳,所以这里的代码很少
// 片段
final RecyclerView view = this.fragmentView.findViewById(R.id.recyclerView);
view.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
//layoutManager.setItemPrefetchEnabled(false);
//layoutManager.setInitialPrefetchItemCount(0);
view.setLayoutManager(layoutManager);
MyAdapter adapter = new MyAdapter(data);
view.setAdapter(adapter);
// 视图持有者
public class MyViewHolder extends RecyclerView.ViewHolder {
ImageView thumbnail;
TextView name;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
}
}
// 适配器
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// create a new view
final View view = LayoutInflater.from(parent.getContext()).inflate(R.id.my_layout, parent, false);
final MyViewHolder viewHolder = buildViewHolder(view);
view.setTag(viewHolder);
return viewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder viewHolder, int position) {
final MyData myData = this.data.get(position);
viewHolder.name.setText(myData.getName());
viewHolder.thumbnail.setImageBitmap(getBitmap(myData.getThumbnailPath()));
}
private MyViewHolder buildViewHolder(View view) {
final MyViewHolder viewHolder = new MyViewHolder(view);
viewHolder.name = view.findViewById(R.id.name);
viewHolder.thumbnail = view.findViewById(R.id.thumbnail);
return viewHolder;
}
解决方案
我没有正确理解你的问题,我也无法发表评论。但是,如果您的问题是视图被回收,请尝试:
holder.setIsRecyclable(false).
在onBindViewHolder()
这里面告诉“嘿recyclerview,停止回收这么多视图”
推荐阅读
- javascript - 将获取的数据渲染到屏幕上
- java - 反序列化失败的 Kafka 消费者行为
- tsql - MERGE 语句中的 TSQL OUTPUT 子句引发消息 596“无法继续执行,因为会话处于终止状态”
- c# - 后台服务破坏 Web API 性能
- pandas - Pandas resample().size() 根据采样频率返回不同的对象类型
- python - 找出一个奇怪形状的面积
- javascript - clearTimeout 不会每次都清除它
- select - Hive 基于不同条件的聚合列
- c# - 如何统一更新一次
- git - 如何从我和 github 上的其他人那里删除推送的提交?