【问题标题】:Android RecyclerView and CheckableTextView Checking Bug [duplicate]Android RecyclerView 和 CheckableTextView 检查错误 [重复]
【发布时间】:2021-01-11 16:18:44
【问题描述】:

我有一个包含 RecyclerView 和 CheckableTextViews 的 recyclerview 活动。列表中有 15 个元素,它是可滚动的。我使用 RecyclerView Adapter 来填充列表,写入 textviews 并监听 click 事件,我使用 click 事件来切换复选框状态。到目前为止,一切都按预期工作。但是当我检查其中一项并向下滚动和备份时。我看到该元素未选中,然后其他元素之一自行检查。每次我上下滚动时,都会检查其他一些元素。我找不到有关此问题的任何信息。

【问题讨论】:

  • 询问了无数次......您需要将状态存储在元素本身并在重新绑定视图后恢复它
  • 这不是一个错误,这些项目一旦离开屏幕就会被回收(因此是 recyclerview)。您必须将它们的状态保存在某个变量中。
  • 您好 M. Toy,欢迎来到 Stack Overflow;如果您提供a minimal reproducible example 您正在做的事情会更好。在这种特殊情况下,最好在询问之前“搜索”,因为这个问题是一个非常非常基本的 RecyclerView 功能。如果您想查看一个示例,其中回收器视图的项目具有改变其状态的单击侦听器,请查看包含一个非常简单的示例的this repository。如果您想查看 VM 也可以正常工作,请查看 withViewModel 分支。
  • 简而言之,驱动适配器的数据(然后以 ViewHolders 的形式绑定到“视图”)应该被适配器/视图视为“只读”。视图应该通知一个事件(并通过点击监听器推送),例如:嘿,我被点击了!,其他人(可能是 ViewModel/Repository)会选择这个,改变数据并推送/发射/等。例如,一个新的“状态”(一个新的列表,其值已更改以向 ViewHolder 发出绑定时必须“选中”复选框的信号)。看看上面的repo你就明白了。
  • 简单地说,无论您在回收站视图中填充什么数据类,只需在其中添加一个布尔变量(例如 isChecked)并在您在回收站视图中检查它时更新它的值(为 true) .

标签: java android


【解决方案1】:

我现在将复选框状态作为参数发送到ViewHolder,并使用setChecked 更新视图。问题解决了。

class WorkerViewHolder extends RecyclerView.ViewHolder {
    private final CheckedTextView textViewRow;
    WorkerViewHolder(View v) {
        super(v);
        textViewRow = v.findViewById(R.id.textViewRow);
        v.setOnClickListener(v1 -> {
            Personnel p = (Personnel) v.getTag();
            textViewRow.setChecked(!textViewRow.isChecked());
            checklist[workers.indexOf(p)] = textViewRow.isChecked();
        });
    }
    void setLine(Personnel worker, boolean check) {
        textViewRow.getRootView().setTag(worker);
        textViewRow.setText(worker.Nick);
        textViewRow.setChecked(check);
    }
}

【讨论】:

  • 下次请更新问题,不要发布答案,这不能回答您的问题,是吗? :)
  • Personnel p = (Personnel) v.getTag(); -> 您将数据(模型)存储在实际视图中。问题 1。checklist[workers.indexOf(p)] = textViewRow.isChecked(); => 您正在直接从视图中修改模型。问题 2。
  • 这违反了上面概述的两个原则:“驱动适配器的数据(然后以 ViewHolders 的形式绑定到“视图”),应该被视为“只读”适配器/视图。视图应通知事件"
  • 对不起,我正在编辑这个回答:)
  • 看看这个非常简单的 repo:github.com/Gryzor/CheckBoxCounter 看看我是怎么做的。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 2014-05-04
  • 1970-01-01
相关资源
最近更新 更多