OnBindViewHolder下的onClickListener函数给出了奇怪的结果

时间:2016-10-13 13:50:00

标签: java android android-studio android-recyclerview

我使用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"

1 个答案:

答案 0 :(得分:1)

问题是由于ViewHolder的重用。 滚动单元格时,您将重新使用,而不是创建新单元格。

适配器创建了许多与可见单元格相等的单元格,并且当屏幕滚动总是重复使用时。

你应该将它保存在这样的位置已更新TextView的地方,并在onBindViewHolder中添加一个检查以查看是否需要将TextView的文本设置为空字符串,或者"更新消息"根据职位