我正在使用 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/