从Recyclerview保存复选框状态 [英] Saving checkbox state from Recyclerview

查看:323
本文介绍了从Recyclerview保存复选框状态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的Recyclerview中有复选框,现在我可以单击它并显示一个小吃栏.但是任何人都可以帮助我从recyclerview中保存复选框的状态.

I have checkbox in my Recyclerview, now i am able to click it and show a snackbar. But can anyone help me to save the state of the checkbox from the recyclerview.

我已经在recyclerview适配器的onBindViewHolder中创建了一个onclicklistener.

I had created an onclicklistener in onBindViewHolder of the recyclerview adapter.

 private SparseBooleanArray mCheckedItems = new SparseBooleanArray();
        @Override
        public void onBindViewHolder(final RecyclerViewHolder viewHolder, int i) {
            // get the single element from the main array
            DisplayImageOptions options = new DisplayImageOptions.Builder()
                    .showImageOnLoading(R.drawable.mirlogo)
                    .showImageForEmptyUri(R.drawable.gallery_no_image)
                    .showImageOnFail(R.drawable.gallery_image_fail)
                    .cacheInMemory(true)
                    .cacheOnDisk(true)
                    .considerExifParams(true)
                    .bitmapConfig(Bitmap.Config.RGB_565)
                    .build();

            final String images = HomeDataImages.IMAGES[i];
            // Set the values

            ImageLoader.getInstance()
                    .displayImage(images, viewHolder.mImage, options);

             viewHolder.mCheck.setChecked(mCheckedItems.get(i));
        Log.d("Position=", String.valueOf((mCheckedItems.get(i))));

        viewHolder.mCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                int position = viewHolder.getAdapterPosition();
                mCheckedItems.put(position, isChecked);
                Log.d("Checked Array = ", String.valueOf(mCheckedItems));
//                viewHolder.mCheck.setChecked(mCheckedItems);
//error comes here setChecked(boolean) cannot be applied to SparseBooleanArray
               if (isChecked){
                Snackbar snackbar = Snackbar.make(viewHolder.itemView, "Item Favorited", Snackbar.LENGTH_SHORT);
                snackbar.show();}
                else{
                   Snackbar snackbar = Snackbar.make(viewHolder.itemView, "Item Unfavorited", Snackbar.LENGTH_SHORT);
                   snackbar.show();}
               }
            });

    }

提前谢谢.

推荐答案

假设viewHolder.mCheckCheckedTextView,我将使用以下方式:

Assuming viewHolder.mCheck is a CheckedTextView I would use some like this:

private SparseBooleanArray mCheckedItems = new SparseBooleanArray();

@Override
public void onBindViewHolder(final RecyclerViewHolder viewHolder, int i) {
    // get the single element from the main array
    DisplayImageOptions options = new DisplayImageOptions.Builder()
            .showImageOnLoading(R.drawable.mirlogo)
            .showImageForEmptyUri(R.drawable.gallery_no_image)
            .showImageOnFail(R.drawable.gallery_image_fail)
            .cacheInMemory(true)
            .cacheOnDisk(true)
            .considerExifParams(true)
            .bitmapConfig(Bitmap.Config.RGB_565)
            .build();

    final String images = HomeDataImages.IMAGES[i];
    // Set the values

    ImageLoader.getInstance()
            .displayImage(images, viewHolder.mImage, options);

    viewHolder.mCheck.setChecked(mCheckedItems.get(i));

    viewHolder.mCheck.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position = viewHolder.getAdapterPosition();
            final boolean newValue = !mCheck.isChecked();

            mCheckedItems.put(position, newValue);
            checkedTextView.setChecked(newValue);

            //display the text accordingly with the newValue value
            Snackbar snackbar = Snackbar.make(v, "Item Favorited", Snackbar.LENGTH_SHORT);
            snackbar.show();
        }
    });

    public List<Integer> getSelectedItemPositions() {
        List<Integer> selected = new ArrayList<>();
        for (int i = 0; i < mCheckedItems.size(); i++) {
            final boolean checked = mCheckedItems.valueAt(i);
            if (checked) {
                selected.add(mCheckedItems.keyAt(i));
            }
        }
        return selected;
    }

    public void restoreSelectedItems(List<Integer> positions){
        for (Integer position : positions) {
            mCheckedItems.put(position, true);
        }
    }
}

基本上,我正在使用SparseBooleanArray来存储要检查的元素.

Basically I'm using a SparseBooleanArray in order to store which elements are checked.

这篇关于从Recyclerview保存复选框状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆