复选框变得“粘”'在RecyclerView

时间:2017-06-18 10:16:04

标签: java android checkbox dialog android-recyclerview

我有一个对话框,通过带有复选框的列表接收用户输入,复选框的布局为RecyclerView。但是当我在列表中选择CheckBox时,列表中的另一个CheckBox也会被检查,但我没有做到。这些图片将有助于说明我的观点。

在这里,我只选择了日历和相机:

enter image description here

但是在列表的下方,谷歌和地图也会被选中,我没有选择。

enter image description here

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'回收'列表,然后我上去,我的早期选择未被选中。

我希望有关如何摆脱“粘性”的任何建议。复选框。

2 个答案:

答案 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可能是你在与父母沟通时所寻找的。