Android RecyclerView适配器复选框操作

Android RecyclerView适配器复选框操作,android,checkbox,android-recyclerview,Android,Checkbox,Android Recyclerview,我使用RecyclerView和适配器来显示类对象数组的数据。我有一个主文件夹和两个副文件夹-项目文件夹和标题文件夹。项目持有者有复选框。在RecyclerView中,我对对象的一个参数使用了一个复选框。我怎样才能保存它?剩下的我使用SharedReference,但在这里我不知道如何将它应用到我的活动中 这是我的主支架: public abstract class MainHolder extends RecyclerView.ViewHolder { abstract void s

我使用RecyclerView和适配器来显示类对象数组的数据。我有一个主文件夹和两个副文件夹-项目文件夹和标题文件夹。项目持有者有复选框。在RecyclerView中,我对对象的一个参数使用了一个复选框。我怎样才能保存它?剩下的我使用SharedReference,但在这里我不知道如何将它应用到我的活动中

这是我的主支架:

public abstract class MainHolder extends RecyclerView.ViewHolder {

    abstract void setData(MainItem item);

    public MainHolder(@NonNull View itemView) {
        super(itemView);
    }
}
及项目持有人:

public class ItemHolder extends MainHolder{

    private TextView tvTitle, tvComment, tvDate;
    private CheckBox cbImportance;
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd MMMM", myDateFormatSymbols);



    private static DateFormatSymbols myDateFormatSymbols = new DateFormatSymbols(){

        @Override
        public String[] getMonths() {
            return new String[]{"января", "февраля", "марта", "апреля", "мая", "июня",
                    "июля", "августа", "сентября", "октября", "ноября", "декабря"};
        }

    };

    @Override
    void setData(MainItem item) {
        final Event event = item.getEventItem();
        tvTitle.setText(event.getName());
        tvComment.setText(event.getComment());
        tvDate.setText(simpleDateFormat.format(event.getDate()));
        cbImportance.setOnCheckedChangeListener(null);
        cbImportance.setChecked(event.getImportant());
        cbImportance.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                event.IsImportant = b;
            }
        });

    }

    public ItemHolder(@NonNull View itemView) {
        super(itemView);
        tvTitle = itemView.findViewById(R.id.tvTitle);
        tvComment = itemView.findViewById(R.id.tvComment);
        tvDate = itemView.findViewById(R.id.tvDate);
        cbImportance = itemView.findViewById(R.id.cbIconImportant);
    }

}
这是我的适配器

public class MainAdapter extends RecyclerView.Adapter<MainHolder> {

    private Context context;
    private ArrayList<MainItem> data;
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd MMMM", myDateFormatSymbols);

    private OnItemCheckedListener mOnItemChecked;

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

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




    private static DateFormatSymbols myDateFormatSymbols = new DateFormatSymbols(){

        @Override
        public String[] getMonths() {
            return new String[]{"января", "февраля", "марта", "апреля", "мая", "июня",
                    "июля", "августа", "сентября", "октября", "ноября", "декабря"};
        }

    };

    public MainAdapter(Context context, ArrayList<MainItem> data) {
        this.context = context;
        this.data = data;
    }

    @NonNull
    @Override
    public MainHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
        switch (viewType){
            case (Constants.ITEM_HEADER_TEXT_VIEWTYPE):
                view = LayoutInflater.from(context).inflate(R.layout.group_layout, parent, false);
                return new HeaderHolder(view);
            case (Constants.ITEM_EVENT_TEXT_VIEWTYPE):
                view = LayoutInflater.from(context).inflate(R.layout.list_item_cardview, parent, false);
                return new ItemHolder(view);

            default: throw new IllegalArgumentException();
        }
    }

    @Override
    public void onBindViewHolder(@NonNull final MainHolder holder, final int position) {
        holder.setData(data.get(position));
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (holder.getItemViewType() == Constants.ITEM_HEADER_TEXT_VIEWTYPE)
                    Toast.makeText(context, "Нажал на заголовок" + position, Toast.LENGTH_SHORT).show();

                else
                    Toast.makeText(context, "Нажал на айтем" + position, Toast.LENGTH_SHORT).show();
            }
        });



    }

    @Override
    public int getItemViewType(int position) {
        return data.get(position).getViewType();
    }
公共类MainAdapter扩展了RecyclerView.Adapter{ 私人语境; 私有数组列表数据; SimpleDataFormat SimpleDataFormat=新的SimpleDataFormat(“dd MMMM”,myDateFormatSymbols); 私人监听系统已检查McHeckedListener监视器; 公共接口:MCheckedListener{ void-onItemChecked(int位置,布尔值很重要); } public void setOnItemCheckedListener(OnItemCheckedListener侦听器){ mOnItemChecked=监听器; } 私有静态DateFormatSymbols myDateFormatSymbols=新DateFormatSymbols(){ @凌驾 公共字符串[]getMonths(){ 返回新字符串[]{“ааааа”、“фааа”、“ааа”、“аа”, "июля", "августа", "сентября", "октября", "ноября", "декабря"}; } }; 公共主适配器(上下文、ArrayList数据){ this.context=上下文; 这个数据=数据; } @非空 @凌驾 public MainHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){ 视图; 开关(视图类型){ 案例(常量。项目\标题\文本\视图类型): view=LayoutFlater.from(上下文)。充气(R.layout.group_布局,父级,false); 返回新的HeaderHolder(视图); 案例(常量。项目\事件\文本\视图类型): 视图=LayoutFlater.from(上下文)。充气(R.layout.list\u item\u cardview,parent,false); 返回新项目持有者(视图); 默认值:抛出新的IllegalArgumentException(); } } @凌驾 public void onBindViewHolder(@NonNull final MainHolder,final int position){ holder.setData(data.get(position)); holder.itemView.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图){ if(holder.getItemViewType()==Constants.ITEM\u HEADER\u TEXT\u VIEWTYPE) Toast.makeText(上下文,“ажазаазааааааааааа; 其他的 Toast.makeText(上下文,“位置,Toast.LENGTH.SHORT”); } }); } @凌驾 public int getItemViewType(int位置){ 返回data.get(position.getViewType(); }
好的,我在ItemHolder中公开了复选框。 在OnBindHolder中,我对复选框进行了一次检查

 @Override
    public void onBindViewHolder(@NonNull final MainHolder holder, final int position) {
        holder.setData(data.get(position));
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (holder.getItemViewType() == Constants.ITEM_HEADER_TEXT_VIEWTYPE)
                    Toast.makeText(context, "Нажал на заголовок" + position, Toast.LENGTH_SHORT).show();

                else
                    Toast.makeText(context, "Нажал на айтем" + position, Toast.LENGTH_SHORT).show();
            }
        });

        if (holder.getItemViewType() == Constants.ITEM_EVENT_TEXT_VIEWTYPE){
            ((ItemHolder) holder).cbImportance.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                    data.get(position).getEventItem().IsImportant = b;
                    if (b){
                        Toast.makeText(context, "IMPORTANT", Toast.LENGTH_SHORT).show();
                    }
                    else{
                        Toast.makeText(context, "NON IMPORTANT", Toast.LENGTH_SHORT).show();
                    }
                    notifyDataSetChanged();
                    mOnItemChecked.onItemChecked(position, b);

                }
            });
        }

    }
在片段中,我写入复选框的状态

adapterEvent.setOnItemCheckedListener(new MainAdapter.OnItemCheckedListener() {
            @Override
            public void onItemChecked(int position, boolean isImportant) {
                write(getContext(), events, PROCESSED_EVENTS);
                ShowEvents(ShowMode);
            }
        });