【问题标题】:Checkbox state not saving in RecyclerView复选框状态未保存在 RecyclerView 中
【发布时间】:2018-07-08 13:29:35
【问题描述】:

我有一个recyclerView,其中包含已安装应用程序的名称、包名称和图标。我在recyclerView 中添加了复选框,并且由于当我选中一个框并滚动然后框的状态发生变化时视图的循环性质。所以,我想知道的是,有没有办法让复选框在滚动后保持原样?我试过this 但无法掌握。我没有DataModel 课程。 这是我的回收站适配器:

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

    Context context1;
    List<String> stringList;

    public AppsAdapter(Context context, List<String> list){

        context1 = context;

        stringList = list;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder{

        public CardView cardView;
        public ImageView imageView;
        public TextView textView_App_Name;
        public TextView textView_App_Package_Name;
        public CheckBox checkBox;


        public ViewHolder (View view){

            super(view);

            this.setIsRecyclable(false);

            cardView = (CardView) view.findViewById(R.id.card_view);
            imageView = (ImageView) view.findViewById(R.id.imageview);
            textView_App_Name = (TextView) view.findViewById(R.id.Apk_Name);
            textView_App_Package_Name = (TextView) view.findViewById(R.id.Apk_Package_Name);
            checkBox = (CheckBox)view.findViewById(R.id.cb);

        }
    }

    @Override
    public AppsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){

        View view2 = LayoutInflater.from(context1).inflate(R.layout.cardview_layout,parent,false);

        ViewHolder viewHolder = new ViewHolder(view2);

        return viewHolder;
    }

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

        ApkInfoExtractor apkInfoExtractor = new ApkInfoExtractor(context1);

        final String ApplicationPackageName = (String) stringList.get(position);
        String ApplicationLabelName = apkInfoExtractor.GetAppName(ApplicationPackageName);
        Drawable drawable = apkInfoExtractor.getAppIconByPackageName(ApplicationPackageName);

        viewHolder.textView_App_Name.setText(ApplicationLabelName);

        viewHolder.textView_App_Package_Name.setText(ApplicationPackageName);

        viewHolder.imageView.setImageDrawable(drawable);

        viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                //
            }
        });

    }



    @Override
    public int getItemCount(){

        return stringList.size();
    }


}

【问题讨论】:

  • 创建一个布尔数组,用于存储复选框状态并将其应用于 onBindViewHolder 函数。在视图持有者类中设置监听器 setOnCheckedChangeListener 并使用 getAdapterPosition 来了解位置。

标签: android checkbox android-recyclerview


【解决方案1】:

您可以使用 SparseBooleanArray,它类似于映射,但它是 int 和 boolean 的键值对来存储项目列表中所有项目的状态,然后使用键和值在切换选中状态时进行比较。

    public static SparseBooleanArray itemCheckBoxState = new SparseBooleanArray();

在点击处理程序中:

@Override
        public void onClick(View v) {
            int adapterPosition = getAdapterPosition();
            if (!itemCheckBoxState .get(adapterPosition, false)) {
                mCheckedTextView.setChecked(true);
                itemCheckBoxState .put(adapterPosition, true);
            }
            else  {
                mCheckedTextView.setChecked(false);
                itemCheckBoxState .put(adapterPosition, false);
            }
}

和:

    ViewHolder(View itemView) {
        super(itemView);
        mCheckedTextView = (CheckedTextView) itemView.findViewById(R.id.checked_text_view);
        itemView.setOnClickListener(this);
    }

    void bind(int position) {
        if (!itemCheckBoxState .get(position, false)) {
            mCheckedTextView.setChecked(false);}
        else {
            mCheckedTextView.setChecked(true);
        }

}

【讨论】:

    【解决方案2】:

    不要在 OnBindViewHolder 中设置点击和 getPosition。在 ViewHolder 中使用它们并获取位置 - getAdapterPosition()。祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 2012-04-18
      • 1970-01-01
      • 2013-06-12
      相关资源
      最近更新 更多