【问题标题】:onClickListener functions under OnBindViewHolder gives weird resultsOnBindViewHolder 下的 onClickListener 函数给出了奇怪的结果
【发布时间】:2016-10-13 13:50:00
【问题描述】:

我正在使用 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,则消息在其上显示为“更新消息”,但是当我向下滚动到其他 ViewHolder 时,第五个 ViewHolder 也包含“更新消息” 9号、13号等已经有消息显示在上面。同样,如果我按下第二个 ViewHolder 上的提交按钮,消息也会显示在第二个、第六个、第十个、第十四个等等。

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

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

我不知道为什么会发生这种情况,而且我以前从未使用过 onBindViewHolder 函数,但我觉得这与 ViewHolder holder "final" 的论点有关。

【问题讨论】:

    标签: java android android-studio android-recyclerview


    【解决方案1】:

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

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

    你应该把它保存在某个位置已经更新了TextView,并在onBindViewHolder中添加一个检查,看看你是否需要将TextView的文本设置为空字符串,或者根据位置“更新消息”

    【讨论】:

    • 知道了!所以我可以检查某个位置是否单击了按钮,然后它只会通过该 ViewHolder 的 onCreate 显示消息。不知道 ViewHolders 的重用。谢谢!
    猜你喜欢
    • 2017-02-02
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    相关资源
    最近更新 更多