我使用RecyclerView.Adapter显示多个携带不同消息的ViewHolder。这是onBindViewHolder函数:
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
holder.submitButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.messageTextView.setText("Updated message");
}
});
}
发生的奇怪事情是,如果我在第一个ViewHolder上按下submitButton,那么消息就显示在"更新消息"但是当我向下滚动到其他ViewHolders时,第五个ViewHolder包含"更新消息"同样,第9,13等已经显示了消息。同样,如果我在第二个ViewHolder上按下submitButton,消息也会显示在第2,第6,第10,第14等等。
理想情况下,它应该有效,如果我在第一个ViewHolder上按下submitButton,该消息应该只显示在第一个ViewHolder而不是其他人。
我必须将参数 ViewHolder holder 设置为 final ,以便我可以在onClick函数的内部类中调用它。
我不知道为什么会发生这种情况而且之前我还没有使用过onBindViewHolder函数,但我觉得它与参数ViewHolder持有者相关的是" final"
答案 0 :(得分:1)
问题是由于ViewHolder的重用。 滚动单元格时,您将重新使用,而不是创建新单元格。
适配器创建了许多与可见单元格相等的单元格,并且当屏幕滚动总是重复使用时。
你应该将它保存在这样的位置已更新TextView的地方,并在onBindViewHolder中添加一个检查以查看是否需要将TextView的文本设置为空字符串,或者"更新消息"根据职位