在创建 Android 应用程序时,我遇到了这样一个事实:RecyclerView 列表在其形成过程中,会从该列表中已存在的元素中为每第十个元素分配与 ImageView 元素相同的链接。简单地说,只有前 9 项有唯一的 ImageView 引用,其余的只需复制它即可。有没有人经历过这种情况,请解释为什么会发生这种情况。这可能是我的一个错误。
public class DataHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private final TextView topic;
private final TextView date;
private final TextView body;
private ImageView deleteMarker;
private NotesListActivity notesListActivity;
private ListItem listItem;
public DataHolder(@NonNull View itemView) {
super(itemView);
topic = itemView.findViewById(R.id.topicTv);
date = itemView.findViewById(R.id.dateTv);
body = itemView.findViewById(R.id.bodyTv);
itemView.setOnClickListener(this);
}
public void setData(ListItem listItem) {
topic.setText(listItem.getTopic());
date.setText(listItem.getDate());
body.setText(listItem.getBody());
}
@Override
public void onClick(View v) {
deleteMarker = itemView.findViewById(R.id.deleteMarker);
notesListActivity = (NotesListActivity) context;
listItem = listItems.get(getAdapterPosition());
notesListActivity.listItemsEditor(listItem, deleteMarker);
}
}
说的就是这个阶段deleteMarker = itemView.findViewById(R.id.deleteMarker);。当deleteMarker的可见性改变时,两个元素的可见性改变,即被选择的元素和距离它10个元素的元素。
您没有考虑到视图元素被重用。
RecyclerView创建尽可能多的视图,可以同时在屏幕上看到。为了显示其余数据,使用相同的视图 - 它们在滚动时简单地移动。第一个消失的将成为下一个出现的。因此,您不应该引用视图,而是需要将逻辑与位置或数据内容联系起来。
持有者不能包含方法
onClick,因为 回收器仅创建有限数量的元素(屏幕上适合的元素+屏幕之外的元素。这是优化 UI 所必需的,也是与 的主要区别ListView)处理回收元素的点击通常有两种方式:
在一种方法中
onBindViewHolder- 它被认为是一个电影,但一个工作变体。缺点 -
onBindViewHolder每次重新创建元素时都会调用它。如果您有不同的点击元素的逻辑,则适合。
如果点击所有卡片的逻辑是相同的,一个不错的选择是在创建 Holder 之后但在返回它之前,
onClick在方法中编写逻辑onCreateViewHolder这段代码是完美优化的,因为
onBindViewHolder与每次元素显示在屏幕上时调用的 不同,该方法仅onCreateViewHolder在创建卡片时起作用一次。