kir*_*403 3 checkbox android android-recyclerview
我正在工作的地方有复选框RecyclerView。我知道其中的一些问题。但是,只有10个项目并且没有滚动错误的侦听器被调用。
我有这样的事情:
private class MyAdapter extends RecyclerView.Adapter<MyViewHodler> {
ArrayList<String> items;
ArrayList<String> checkedList = new ArrayList<>();
...
public void onBindViewHolder(final MyViewHolder holder, int position) {
String item = items.get(position);
String check = checkedList.get(item);
if(check != null)
holder.vChecked.setChecked(true);
else
holder.vChecked.setChecked(false);
....
holder.vChecked.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
if (isChecked) {
checkedList.add(item);
} else {
checkedList.remove(item);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,奇怪的是,这个checkedChange调用是在不同的视图上进行的。我只有10个项目的清单,适合recyclerview,没有滚动。我从外部更改数据(项目和检查清单),设置新数据并调用myAdapter.notifyDatasetChanged()
此调用从选中状态中删除了另一个项目。
例如,我检查了10个项目。我取消选中1个项目,然后根据并调用进行其他一些计算myAdapter.notifyDatasetChanged()。它还从其他9个项目中取消选中另一个元素。
因此,即使不滚动,为什么为错误的视图调用onCheckedChange侦听器?
我发现了问题。我以为onBindViewHolder每个视图都需要更改数据。但是我错了。
notifyDatasetChanged()回收屏幕上的所有视图持有者,并从回收的视图持有者池中随机选择视图持有者以绑定新数据。因此,当我调用时notifyDatasetChanged,在不同位置使用了Viewholder,因此又更改了一项。
因此,我onViewRecycled在回收者视图的方法中将侦听器删除为null 。像这样:
@Override
public void onViewRecycled(MyViewHolder holder) {
super.onViewRecycled(holder);
holder.vChecked.setOnCheckedChangeListener(null);
}
Run Code Online (Sandbox Code Playgroud)
这样,确实解决了问题。我意识到了这一点,但是我认为如果没有滚动,则视图持有者会在相同位置重复使用。但是onDatasetChanged回收所有当前使用的视图持有者,然后从随机池中再次使用它。
| 归档时间: |
|
| 查看次数: |
1398 次 |
| 最近记录: |