问题:一次选中两个复选框,同时选择RecyclerView Adapter

时间:2017-12-30 05:55:07

标签: android checkbox android-recyclerview recyclerview-layout

现在我正在使用RecyclerView和CheckBox。我的目标是选中复选框列表。这里我的问题是当我尝试选择任何一个Checkbox意味着它同时选择两个Checkbox。例如,我在第0个位置选中Checkbox,但它自动选择第0和第13个两个位置复选框都被选中。

  

滚动时没有重复项目添加,请理解清楚..

在这里,我必须附上我的RecyclerView适配器类。请任何人帮助我..

先谢谢。

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    private ArrayList<ModuleViewModel> items =  new ArrayList<>();
    private OnItemCheckListener onItemClick;
    private Context mContext;

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_modules_list, parent, false);

        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        final ModuleViewModel currentItem = items.get(position);
        holder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    holder.checkbox.setChecked(
                            ! holder.checkbox.isChecked());
                    if ( holder.checkbox.isChecked()) {
                        onItemClick.onItemChecked(currentItem);
                    } else {
                        onItemClick.onItemUnchecked(currentItem);
                    }
            }
        });
    }

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

    public interface OnItemCheckListener {
        void onItemChecked(ModuleViewModel item);
        void onItemUnchecked(ModuleViewModel item);
    }

    public MyAdapter (Context context,ArrayList<ModuleViewModel> items, @NonNull OnItemCheckListener onItemCheckListener) {
        this.mContext = context;
        this.items = items;
        this.onItemClick = onItemCheckListener;
    }


    static class MyViewHolder extends RecyclerView.ViewHolder {
        CheckBox checkbox;
        View itemView;

        public MyViewHolder(View itemView) {
            super(itemView);
            this.itemView = itemView;
            checkbox = (CheckBox) itemView.findViewById(R.id.uiCkbModule);
            checkbox.setClickable(false);

        }

        public void setOnClickListener(View.OnClickListener onClickListener) {
            itemView.setOnClickListener(onClickListener);
        }
    }
}

这是我的适配器调用代码

mModuleListAdapter = new ModuleListAdapter(mContext, mModuleListModel, this);
 mRvModuleView.setAdapter(mModuleListAdapter);

4 个答案:

答案 0 :(得分:2)

你好@Raja这是由于recyclerview的行为。我遇到了同样的问题,所以对于解决方案我将复选框状态存储在我的模型中

  

public boolean status = false;

默认情况下 比onclicklistner更新列表视图中的状态,这将解决您的问题。

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
    final Student student = items.get(position);
    holder.checkbox.setText(student.name + " :: " + student.department);
    holder.checkbox.setChecked(student.status);
    holder.checkbox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (holder.checkbox.isChecked()) {
                onItemClick.onItemChecked(student);
            } else {
                onItemClick.onItemUnchecked(student);
            }
            student.status = holder.checkbox.isChecked();
            items.remove(position);
            items.add(position, student);
        }
    });
}

比完全为我工作..

答案 1 :(得分:1)

请你修改下面的函数,我相信ModelViewModel对象会有一些布尔变量来保存复选框的状态。

@Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        final ModuleViewModel currentItem = items.get(position);
        holder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                holder.checkbox.setChecked(! holder.checkbox.isChecked());
                if ( holder.checkbox.isChecked()) {
                    onItemClick.onItemChecked(currentItem);
                } else {
                    onItemClick.onItemUnchecked(currentItem);
                }
            }
        });

        if(!currentItem.isChecked) {
            holder.checkbox.setChecked(false);
        }else {
            holder.checkbox.setChecked(true);
        }
    }

答案 2 :(得分:1)

这主要是因为recyclerview回收/重用已经创建的项目视图以减少资源消耗。

有两种方法可以解决这个问题:

  1. ModuleViewModel 模型类中添加布尔变量 isChecked 并为每个列表项设置true / false。在这种方法中,checked的值将为类本身中的每个模型类保存。

  2. 创建与 项目 相同大小的布尔 isChecked 的广告词典。 isChecked arraylist的每个元素都对应于recyclerview列表的每个项目。然后,您可以在该位置参考 isChecked 的值,将setChecked(true / false)复选为您的复选框。

答案 3 :(得分:0)

尝试在模型中选择一个boolean,例如isChecked,并为boolean变量创建getter和setter方法

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

            if (isChecked) {
                items.get(position).isChecked=isChecked;
            } else {    
                items.get(position).isChecked=isChecked;
            }

        }
    });

而不是试试这个

holder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                    if ( items.get(position).isChecked())) {
                        onItemClick.onItemChecked(currentItem);
                    } else {
                        onItemClick.onItemUnchecked(currentItem);
                    }
            }
        });