我有一个对话框,通过带有复选框的列表接收用户输入,复选框的布局为RecyclerView
。但是当我在列表中选择CheckBox
时,列表中的另一个CheckBox
也会被检查,但我没有做到。这些图片将有助于说明我的观点。
在这里,我只选择了日历和相机:
但是在列表的下方,谷歌和地图也会被选中,我没有选择。
bindActivity
的代码是:
public void bindActivity(ResolveInfo resolveInfo)
{
mResolveInfo = resolveInfo;
PackageManager pm = getActivity().getPackageManager();
String appName = mResolveInfo.loadLabel(pm).toString();
mAppImageView.setImageDrawable(resolveInfo.loadIcon(pm));
mAppTextView.setText(appName);
}
如果我在mAppCheckBox.setChecked(false)
中添加bindActivity
,那么当我在列表中进一步向下并且RecyclerView
'回收'列表,然后我上去,我的早期选择未被选中。
我希望有关如何摆脱“粘性”的任何建议。复选框。
答案 0 :(得分:2)
您会看到该行为,因为ViewHolder
正在重复使用。向下滚动后,上面项目的ViewHolder
(现在不可见)将重新用于将要显示的新项目。此ViewHolder
有一个CheckBox
之前已经检查过,没有人明确说过,应该取消选中它。
您应该正确处理重置状态。您可以将已检查的项目位置保存在数组中,稍后在onBindViewHolder()
中正确设置所选的CheckBox
状态:
public class MyAdapter extends RecyclerView.Adapter<Item> {
final boolean[] checkedArr;
public MyAdapter(List<Item> list) {
checkedArr = new boolean[list.size()];
// Filling all the items as unchecked by default
Arrays.fill(checkedArr, false);
}
@Override public void onBindViewHolder(Item holder, int position) {
// You have removed the listener in `onViewRecycled`
// Thus, this `setChecked()` won't cause any listener to be fired
holder.checkbox.setChecked(checkedArr[holder.getAdapterPosition()]);
holder.checkbox.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
// Retaining checked state in the array
checkedArr[holder.getAdapterPosition()] = isChecked;
});
}
@Override public void onViewRecycled(Item holder) {
super.onViewRecycled(holder);
// When view is being recycled remove the listener
holder.checkbox.setOnCheckedChangeListener(null);
}
...
}
或者您可以避免&#34;重新发明轮子&#34; 并使用随MultiViewAdapter
一起发货的checkboxes feature:单人,单人或无人,多种模式
答案 1 :(得分:0)
a)在绑定视图时,看起来您没有设置复选框的选中状态。跟踪已选择的项目,然后在进行视图绑定时设置检查状态。
b)我不确定你的意思,但从我收集的内容来看,the dialog documenation可能是你在与父母沟通时所寻找的。 p>