【发布时间】: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) .