首页 > 解决方案 > 如何从 RecyclerView 保存 CheckBox 状态?

问题描述

我正在使用 RecyclerView 和适配器来显示 Event 对象数组的数据。在 RecyclerView 中,我使用 CheckBox 作为对象的参数之一。我怎样才能保存它?其余的我使用 SharedPreferences,但在这里我不知道如何在我的 Activity 中应用它。

这是我的课堂活动:

public class Event implements Serializable {
public String Name;
public Long Date; 
public String Comment;
public String Type;
public String Notify;
public Boolean IsComplete;
public Boolean IsImportant;

Event()
{
    Name = "Событие";
    Date = MaterialDatePicker.todayInUtcMilliseconds();
    Comment = "Comment";
    Type = "Material";
    Notify = "Не напоминать";
    IsComplete = false;
    IsImportant = false;
}

Event(String name, Long date, String comment, String type, String notify, Boolean iscomplete, Boolean isimportant)
{
    Name = name;
    Date = date;
    Comment = comment;
    Type = type;
    Notify = notify;
    IsComplete = iscomplete;
    IsImportant = isimportant;
}

public String getName() {
    return Name;
}

public Long getDate() {
    return Date;
}

public String getComment() {
    return Comment;
}

public String getType() {
    return Type;
}

public String getNotify() {
    return Notify;
}

public Boolean getComplete() {
    return IsComplete;
}

public Boolean getImportant() {
    return IsImportant;
}

}

还有我的回收站视图和适配器:

public class EventAdapter extends RecyclerView.Adapter<EventAdapter.EventViewHolder> {
private static final String TAG = "myLogs";
private ArrayList<Event> mEventList;
private OnItemClickListener mListener;
public interface OnItemClickListener {
    void onItemClick(int position);
}



public void setOnItemClickListener(OnItemClickListener listener){
    mListener = listener;
}

public static class EventViewHolder extends RecyclerView.ViewHolder{
   public TextView TVtitle;
   public TextView TVcomment;
   public CheckBox CBimportance;



   public EventViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
       super(itemView);
       TVtitle = itemView.findViewById(R.id.tv1);
       TVcomment = itemView.findViewById(R.id.tv2);
       CBimportance = itemView.findViewById(R.id.iconImportant);

       itemView.setOnClickListener(new View.OnClickListener(){

           @Override
           public void onClick(View view) {
                if (listener != null){
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION){
                        listener.onItemClick(position);
                    }
                }
           }
       });


   }

}
public EventAdapter(ArrayList<Event> listEvent){


    mEventList = listEvent;}

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

@Override
public void onBindViewHolder(@NonNull EventViewHolder holder, final int position) {
    final Event item = mEventList.get(position);

    holder.TVtitle.setText(item.getName());
    holder.TVcomment.setText(item.getComment());

    holder.CBimportance.setOnCheckedChangeListener(null);

    holder.CBimportance.setChecked(item.getImportant());

    holder.CBimportance.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            item.IsImportant = b;
            if (b){
                Log.d(TAG, String.valueOf(position) + " IMPORTANT");
            }
            else{
                Log.d(TAG, String.valueOf(position) + " NON IMPORTANT");
            }
        }
    });

}

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

}

例如,对于 ItemClick 和在我的 Activity 中保存的更改,我使用 onItemClick:

adapterEvent.setOnItemClickListener(new EventAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(int position) {
            eventsProcess.remove(position);
            adapterEvent.notifyItemRemoved(position);
            write(getContext(), eventsProcess, PROCESSED_EVENTS);
        }
    });
public static void write(Context context, ArrayList<Event> events, String Key)
{
    Gson gson = new Gson();
    String jsonString = gson.toJson(events);
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = pref.edit();
    editor.putString(Key, jsonString);
    editor.apply();
}

标签: androidcheckboxandroid-recyclerviewsharedpreferences

解决方案


您应该能够完全按照您处理“OnItemClick”的方式执行此操作。我在您的适配器中进行了一些更改,以添加一个新接口 OnItemCheckedListener,然后使用此侦听器处理复选框 checkedChanged 事件。(而不是像你那样记录它)。

public class EventAdapter extends RecyclerView.Adapter<EventAdapter.EventViewHolder> {
    private static final String TAG = "myLogs";
    private ArrayList<Event> mEventList;

    private OnItemClickListener mListener;
    public interface OnItemClickListener {
        void onItemClick(int position);
    }
    public void setOnItemClickListener(OnItemClickListener listener){
        mListener = listener;
    }

    private OnItemCheckedListener mOnItemChecked;
    public interface OnItemCheckedListener {
        void onItemChecked (int position, boolean isImportant);

    }
    public void setOnItemCheckedListener (OnItemCheckedListener listener) {
        mOnItemChecked = listener;
    }


    public static class EventViewHolder extends RecyclerView.ViewHolder{
        public TextView TVtitle;
        public TextView TVcomment;
        public CheckBox CBimportance;



    
    
        public EventViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
            super(itemView);
            TVtitle = itemView.findViewById(R.id.tv1);
            TVcomment = itemView.findViewById(R.id.tv2);
            CBimportance = itemView.findViewById(R.id.iconImportant);

            itemView.setOnClickListener(new View.OnClickListener(){

                @Override
                public void onClick(View view) {
                        if (listener != null){
                            int position = getAdapterPosition();
                            if (position != RecyclerView.NO_POSITION){
                                listener.onItemClick(position);
                            }
                        }
                }
            });


        }

    }

    public EventAdapter(ArrayList<Event> listEvent){
        mEventList = listEvent;
    }

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

    @Override
    public void onBindViewHolder(@NonNull EventViewHolder holder, final int position) {
        final Event item = mEventList.get(position);

        holder.TVtitle.setText(item.getName());
        holder.TVcomment.setText(item.getComment());

        holder.CBimportance.setOnCheckedChangeListener(null);

        holder.CBimportance.setChecked(item.getImportant());

        holder.CBimportance.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                item.IsImportant = b;
                if (b) {
                    Log.d(TAG, String.valueOf(position) + " IMPORTANT");
                }
                else{
                    Log.d(TAG, String.valueOf(position) + " NON IMPORTANT");
                }
                mOnItemChecked.onItemChecked(position, b)
            }
        });

    }

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

现在,从您的活动中只需设置 EventAdapter 的 OnItemCheckedListener。

 adapterEvent.setOnItemCheckedListener(new EventAdapter.OnItemCheckedListener {
        @Override
        public void onItemChecked (int position, boolean isImportant) {
            // TODO: 
            // whatever you want to do with the isImportant data 
        }
    });

推荐阅读