Android 复选框在一次单击中选中两次

Android 复选框在一次单击中选中两次,android,Android,我有一个回收器视图和一个适配器类。在视图的一个列表单元格中有一个复选框。根据检查,我的视图中的一个按钮处于启用/禁用状态。但我发现当在框中打一个勾选时。按钮启用被调用两次。我对一些复选框使用了一些单一选择(在适配器类中使用名为enforcedexclusivity()的方法选中了条件)。因此,对于该复选框,取消选中可以正常工作,但选中被调用3次。我把我的代码放在下面。请告诉我解决办法 public class FurtherExtrasAdapter extends RecyclerView.A

我有一个回收器视图和一个适配器类。在视图的一个列表单元格中有一个复选框。根据检查,我的视图中的一个按钮处于启用/禁用状态。但我发现当在框中打一个勾选时。按钮启用被调用两次。我对一些复选框使用了一些单一选择(在适配器类中使用名为enforcedexclusivity()的方法选中了条件)。因此,对于该复选框,取消选中可以正常工作,但选中被调用3次。我把我的代码放在下面。请告诉我解决办法

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


ArrayList<Item> items;
Context context;
int flag = 0;
private CouponCodeActivity mThis;

public FurtherExtrasAdapter(ArrayList<Item> items, CouponCodeActivity mThis, Context context) {
    this.items = items;
    this.mThis = mThis;
    this.context = context;
}

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

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

    ;
    holder.enrolment.setText(items.get(position).getName());
    holder.selectEnrollment.setChecked(items.get(position).isPreselect());
    holder.selectEnrollment.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (items.get(position).isPreselect()) {
                items.get(position).setPreselect(false);

            } else {
                EnforcedExclusivity(position);

            }
        }
    });

}

@Override
public int getItemCount() {
    return items.size();
}

public void EnforcedExclusivity(int index) {

    if (items.get(index).isExclusive()) {
        items.get(index).setPreselect(true);

        for (int i = 0; i < items.size(); i++) {
            if (i == index) {
                continue;
            }
            items.get(i).setPreselect(false);
        }


    } else {
        for (int i = 0; i < items.size(); i++) {
            if (items.get(i).isExclusive()) {
                items.get(i).setPreselect(false);

            }
            items.get(index).setPreselect(true);


        }


    }
    notifyDataSetChanged();
}

@Override
public long getItemId(int position) {
    return super.getItemId(position);
}

public class ViewHolder extends RecyclerView.ViewHolder {
    TextView enrolment;
    CheckBox selectEnrollment;

    public ViewHolder(View itemView) {
        super(itemView);
        enrolment = (TextView) itemView.findViewById(R.id.tv_entrollment);
        selectEnrollment = (CheckBox) itemView.findViewById(R.id.cb_select_entrollment);
        selectEnrollment.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {

                    mThis.updateButtonState(1);
                } else {

                    mThis.updateButtonState(-1);
                }
            }
        });

    }
}}

首先,尝试将所有侦听器移动到onBind(…)方法。在onBind(…)的第一行上,将所有侦听器设置为null,然后使用正确的数据选择(…),然后将侦听器设置为所需的侦听器。

您为selectEnrollment对象添加了两个事件。一个是click listener,另一个是setOnCheckedChangeListener(…)…其中有什么交易?为复选框生成两个事件需要什么。有一个setOnCheckedChangeListener()enough@Ahamed首先点击将检查排他性,它将相应地更新。并且setOnchecked将查找更改按钮状态
  rv_further=(RecyclerView)findViewById(R.id.rv_further);
  rv_further.setLayoutManager(manager);
            rv_further.setVisibility(View.VISIBLE);
            rv_further.setHasFixedSize(true);
            rv_further.setItemAnimator(new DefaultItemAnimator());
            rv_further.setAdapter(adapter);

 public void updateButtonState(double num) {

    checkedBoxs += num;

        if (checkedBoxs > 0) {
            Log.d("---CHECKED",String.valueOf(checkedBoxs));
            btnApply.setEnabled(true);
        } else {
            Log.d("---UNCHECKED",String.valueOf(checkedBoxs));
            btnApply.setEnabled(false);
        }
}