Android 如何在recyclerview中保存复选框位置?

Android 如何在recyclerview中保存复选框位置?,android,checkbox,position,android-recyclerview,android-adapter,Android,Checkbox,Position,Android Recyclerview,Android Adapter,我有一份清单。列表项有一个复选框。我想保存项目的状态。状态保存为0或1 我根据状态0或1显示复选框已选中或未选中 它有时显示正确,但当我上下滚动时,更多的项目被选中或取消选中,这是我没有手动完成的 适配器: public class CheckListItemAdapter extends RecyclerView.Adapter<CheckListItemAdapter.MyViewHolder>{ private List<CheckListItem>

我有一份清单。列表项有一个复选框。我想保存项目的状态。状态保存为0或1

我根据状态0或1显示复选框已选中或未选中

它有时显示正确,但当我上下滚动时,更多的项目被选中或取消选中,这是我没有手动完成的

适配器:

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

    private List<CheckListItem> checkListItems;
    Context context;
    private String status;

    private final OnItemClickListener listener;

    public interface OnItemClickListener {
        void onItemClick(CheckListItem item);
    }
    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView title, budget;
        public RelativeLayout parent;
        private CheckBox checkBox;


        public MyViewHolder(View view) {
            super(view);
            title = (TextView) view.findViewById(R.id.title);
            budget =(TextView) view.findViewById(R.id.budget);
            checkBox = (CheckBox) view.findViewById(R.id.checkBox);

        }


        public void bind(final CheckListItem item, final OnItemClickListener listener) {

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override public void onClick(View v) {
                    listener.onItemClick(item);
                }
            });
        }
    }


    public CheckListItemAdapter(List<CheckListItem> checkListItems,Context context,OnItemClickListener listener) {
        this.checkListItems = checkListItems;
        this.context = context;
        this.listener = listener;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.checklist_item, parent, false);

        return new MyViewHolder(itemView);
    }

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

        final CheckListItem item = checkListItems.get(position);
        holder.title.setText(item.getTitle());
        holder.budget.setText(item.getBudget());

        status = item.getStatus();

        if(status.equals("1"))
        {
            holder.checkBox.setChecked(true);
        }
        if(status.equals("0")) {

            holder.checkBox.setChecked(false);
        }

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

                if (isChecked) {

                    status = "1";

                    HashMap<String, String> params = new HashMap<String, String>();


                    params.put("checklistItemId", item.getCheckListItemId());
                    params.put("budget",item.getBudget());
                    params.put("text", item.getTitle());
                    params.put("time_due", item.getDateTime());
                    params.put("reminder",item.getReminder());
                    params.put("status", status);


                    new UpdateCheckListItemsAsyncTask(context).execute(params);


                } else

                {
                    status = "0";

                    HashMap<String, String> params = new HashMap<String, String>();

                    params.put("checklistItemId", item.getCheckListItemId());
                    params.put("budget",item.getBudget());
                    params.put("text", item.getTitle());
                    params.put("time_due", item.getDateTime());
                    params.put("reminder",item.getReminder());
                    params.put("status", status);

                    new UpdateCheckListItemsAsyncTask(context).execute(params);

                }

            }

        });


        holder.bind(checkListItems.get(position), listener);

    }

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

}
公共类CheckListItemAdapter扩展了RecyclerView.Adapter{
私人清单项目;
语境;
私有字符串状态;
私人终场监听者;
公共接口侦听器{
void onItemClick(检查列表项);
}
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图标题、预算;
公共关系青年家长;
私有复选框;
公共MyViewHolder(视图){
超级(视图);
title=(TextView)view.findViewById(R.id.title);
budget=(TextView)view.findViewById(R.id.budget);
checkBox=(checkBox)view.findviewbyd(R.id.checkBox);
}
公共void绑定(最终CheckListItem项,最终监听器){
itemView.setOnClickListener(新视图.OnClickListener(){
@覆盖公共void onClick(视图v){
listener.onItemClick(项);
}
});
}
}
public CheckListItemAdapter(列出checkListItems、上下文上下文和侦听器){
this.checkListItems=checkListItems;
this.context=上下文;
this.listener=listener;
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.checklist_项,父项,假);
返回新的MyViewHolder(itemView);
}
@凌驾
公共无效onBindViewHolder(最终MyViewHolder,内部位置){
最终CheckListItem项目=checkListItems.get(位置);
holder.title.setText(item.getTitle());
holder.budget.setText(item.getBudget());
status=item.getStatus();
如果(状态等于(“1”))
{
holder.checkBox.setChecked(true);
}
如果(状态等于(“0”)){
holder.checkBox.setChecked(false);
}
setOnCheckedChangeListener(newcompoundButton.OnCheckedChangeListener()){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
如果(已检查){
status=“1”;
HashMap params=新的HashMap();
put(“checklistItemId”,item.getCheckListItemId());
参数put(“预算”,item.getBudget());
put(“text”,item.getTitle());
参数put(“time_due”,item.getDateTime());
参数put(“提醒”,item.getrementer());
参数put(“状态”,状态);
新的UpdateCheckListItemsAsyncTask(上下文).execute(参数);
}否则
{
status=“0”;
HashMap params=新的HashMap();
put(“checklistItemId”,item.getCheckListItemId());
参数put(“预算”,item.getBudget());
put(“text”,item.getTitle());
参数put(“time_due”,item.getDateTime());
参数put(“提醒”,item.getrementer());
参数put(“状态”,状态);
新的UpdateCheckListItemsAsyncTask(上下文).execute(参数);
}
}
});
绑定(checkListItems.get(position),侦听器);
}
@凌驾
public int getItemCount(){
返回checkListItems.size();
}
}
这里怎么了?如何保存复选框的位置


谢谢..

我也遇到过类似的问题

问题是,在RecyclerView中,ViewHolder被回收。因此,在
删除oncheckedchangedlistener
之前,这些项将引用旧的oncheckedchangedlistener

    if(status.equals("1"))
    {
        holder.checkBox.setChecked(true);
    }
    if(status.equals("0")) {

        holder.checkBox.setChecked(false);
    }
这些行实际上触发了旧的onCheckedChangedListener

你可以试试这个

  • 添加行
    holder.checkBox.setOnCheckedChangeListener(null)作为onBindViewHolder的第一行
  • 您可以实现一个接口调用,并使用
    getLayoutPosition()
  • 关于你的第二个问题

    您可以使用
    HashSet
    存储选中列表项的数据。 在类对象中存储它的方式也很好

    编辑-添加代码以供参考

        public class CheckListItemAdapter extends RecyclerView.Adapter<CheckListItemAdapter.MyViewHolder> {
        ...
                ..
    
        public CheckListItemAdapter(List<CheckListItem> checkListItems, Context context, OnItemClickListener listener) {
            this.checkListItems = checkListItems;
            this.context = context;
            this.listener = listener;
        }
         @Override
        public void onBindViewHolder(final MyViewHolder holder, int position) {
    
          ....
            ....
    
                if(item.getStatus().equals("1"))
            {
                holder.checkBox.setChecked(true);
            }
            else {
    
                holder.checkBox.setChecked(false);
            }
    
    
    
        public MyViewHolder(View view) {
            super(view);
            title = (TextView) view.findViewById(R.id.title);
            budget = (TextView) view.findViewById(R.id.budget);
            checkBox = (CheckBox) view.findViewById(R.id.checkBox);
            checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                 checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        int pos = getLayoutPosition();
                        CheckListItem currentItem=checkListItems.get(pos);
    //to remove redundant calls to network while scrolling
                        if ( isChecked){
                            if (currentItem.getStatus().equals("1")) {
                                return;
                            } else {
                                currentItem.setStatus("1");
                            }
                        } else {
                            if (currentItem.getStatus().equals("0")) {
                                return;
                            } else {
                                currentItem.setStatus("0");
                            }
                        }
    //network call, when check is changed
                        checkChangedLogic(checkListItems.get(pos), isChecked);
                    }
                });
    
        }
    }
    
    公共类CheckListItemAdapter扩展了RecyclerView.Adapter{
    ...
    ..
    public CheckListItemAdapter(列出checkListItems、上下文上下文和侦听器){
    this.checkListItems=checkListItems;
    this.context=上下文;
    this.listener=listener;
    }
    @凌驾
    公共无效onBindViewHolder(最终MyViewHolder,内部位置){
    ....
    ....
    if(item.getStatus()等于(“1”)
    {
    holder.checkBox.setChecked(true);
    }
    否则{
    holder.checkBox.setChecked(false);
    }
    公共MyViewHolder(视图){
    超级(视图);
    title=(TextView)view.findViewById(R.id.title);
    budget=(TextView)view.findViewById(R.id.budget);
    checkBox=(checkBox)view.findviewbyd(R.id.checkBox);
    setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener(){
    @凌驾
    setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener(){
    @爱