如何在 Recyclerview 中只选择一个复选框并更改 notifydataset

新手上路,请多包涵

在我的代码中,我创建了带有复选框的 recyclerview,并默认选择了一个项目。现在我想要在选择其他项目复选框时取消选择所有其他项目意味着一次选择一个项目。

我的适配器代码:

 public class SupportSchoolIdAdapter extends RecyclerView.Adapter<SupportSchoolIdAdapter.ViewHolder> {

ArrayList<SupportSchoolIdModel> supportSchoolIdModels;
DataPref mDataPref;
String supportSchoolId;

public SupportSchoolIdAdapter(List<SupportSchoolIdModel> supportSchoolIdModels) {
    this.supportSchoolIdModels = new ArrayList<>(supportSchoolIdModels);
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Context context = parent.getContext();
    mDataPref = DataPref.getInstance(context);
    supportSchoolId = mDataPref.getSupportSchoolId();
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.support_school_item, parent, false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    final SupportSchoolIdModel event = supportSchoolIdModels.get(position);
    holder.bindData(supportSchoolIdModels.get(position));

    //in some cases, it will prevent unwanted situations
    holder.checkbox.setOnCheckedChangeListener(null);

    //if true, your checkbox will be selected, else unselected
    holder.checkbox.setChecked(supportSchoolIdModels.get(position).isSelected());

    holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            supportSchoolIdModels.get(holder.getAdapterPosition()).setSelected(isChecked);
        }
    });
    if (supportSchoolIdModels.get(position).getPkSchoolId().equalsIgnoreCase(supportSchoolId)) {
        holder.checkbox.setChecked(true);
    } else {
        holder.checkbox.setChecked(false);
    }
}
@Override
public int getItemCount() {
    return supportSchoolIdModels.size();
}
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder {
    // each data item is just a string in this case
    private TextView schoolIdTxt;
    private TextView schoolNameTxt;
    private CheckBox checkbox;

    public ViewHolder(View v) {
        super(v);
        schoolIdTxt = (TextView) v.findViewById(R.id.schoolIdTxt);
        schoolNameTxt = (TextView) v.findViewById(R.id.schoolNameTxt);
        checkbox = (CheckBox) v.findViewById(R.id.checkbox);
    }
    public void bindData(SupportSchoolIdModel supportSchoolIdModel) {
        schoolIdTxt.setText(supportSchoolIdModel.getPkSchoolId());
        schoolNameTxt.setText(supportSchoolIdModel.getSchoolName());
    }
}
}

第二个问题是当我滚动回收视图时为什么未选中选定的项目。请帮我。

原文由 Kiran Maheshwari 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 286
2 个回答

这是最好的代码!关于 BindViewHolder 的通知

public class SupportSchoolIdAdapter extends RecyclerView.Adapter<SupportSchoolIdAdapter.ViewHolder > {

private Context context;
ArrayList<SupportSchoolIdModel> supportSchoolIdModels;
private int selectedPosition = 0;
private ArrayList<Integer> selectCheck = new ArrayList<>();

public SupportSchoolIdAdapter (Context context, ArrayList<SupportSchoolIdModel> supportSchoolIdModels) {
    this.context = context;
    this.supportSchoolIdModels = supportSchoolIdModels;

//initilize selectCheck
    for (int i = 0; i < supportSchoolIdModels.size(); i++) {
        selectCheck.add(0);
    }

}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.support_school_item, parent, false);
     return new ViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

    if (selectCheck.get(position) == 1) {
        holder.checkbox.setChecked(true);
    } else {
        holder.checkbox.setChecked(false);
    }

    holder.checkbox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            for(int k=0; k<selectCheck.size(); k++) {
                if(k==position) {
                    selectCheck.set(k,1);
                } else {
                    selectCheck.set(k,0);
                }
            }
            notifyDataSetChanged();

        }
    });
    holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if(isChecked==true){
                //Do whatever you want to do with selected value
            }
        }
    });

}

@Override
public int getItemCount() {
    return supportSchoolIdModels== null? 0: supportSchoolIdModels.size();
}

class ViewHolder extends RecyclerView.ViewHolde {

    CheckBox checkbox;

    public ViewHolder(View v) {
        super(v);
        checkbox = (CheckBox) v.findViewById(R.id.checkbox);
    }

}

}

原文由 Hamidreza Shadabkia 发布,翻译遵循 CC BY-SA 4.0 许可协议

1- 您可以在 Adapter 类中创建一个变量,该变量可用于保存所选位置:

private int selectedPosition = -1;// no selection by default

2- 在 onBindViewHolder 内部设置检查状态:

holder.checkBox.setChecked(selectedPosition == position);

3- 在 setOnCheckedChangeListener 中 你必须更新位置

this.selectedPosition = holder.getAdapterPosition();

4- 刷新适配器

adapter.notifyDatasetChanged();

编辑

onBindViewHolder 将被调用所有位置,

所以方法 setChecked 将调用所有复选框,此方法有一个布尔输入。

在上面的例子中,我写 setChecked(selectedPosition == position) 。为了更具可读性,我可以写:

 if(selectedPosition == position){
   holder.checkBox.setChecked(true);
}
else{
   holder.checkBox.setChecked(false);
}

原文由 an_droid_dev 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题