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

标签 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 上按提交按钮,则该消息将显示为“已更新消息”,但当我向下滚动到其他 ViewHolder 时,第 5 个 ViewHolder 也包含“已更新消息” 9号、13号等已经显示了该消息。同样,如果我按下第二个 ViewHolder 上的提交按钮,该消息也会显示在第 2 个、第 6 个、第 10 个、第 14 个等上。

理想情况下,它应该像这样工作,如果我按下第一个 ViewHolder 上的提交按钮,则消息应该只显示在第一个 ViewHolder 上,而不是其他 View 上。

我必须将参数ViewHolderholder设置为final,以便我可以在onClick函数的内部类中调用它。

我不知道为什么会发生这种情况,而且我以前从未使用过 onBindViewHolder 函数,但我觉得这与参数 ViewHolderholder 是“final”有关。

最佳答案

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

适配器创建的单元格数量等于可见单元格的数量,并且当屏幕滚动时始终重用这些单元格。

您应该将其保存在此类位置已更新 TextView 的位置,并在 onBindViewHolder 中添加检查以查看是否需要将 TextView 的文本设置为空字符串,或根据位置设置“更新消息”

关于java - OnBindViewHolder 下的 onClickListener 函数给出了奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40022916/

相关文章:

java - 在Java中一个接一个地播放WAV文件

java - 如何解决java中堆栈内存溢出错误

javascript - Android 浏览器无法正确处理 touchmove 事件

opencv - 如何在android studio 1.5.1中导入openCV 3.1

android - l 预览 : Call requires API level 21 (current min is 20)

java - Itext LargeElement 和 splitRows 选项

java - 对象变量类型是什么意思?

android - 在 Android Studio 中使用 gradle 2.4

android - 发布 Build 时出现 NoSuchMethodException

android - Kotlin 类型不匹配,需要 : x found: x?