簡體   English   中英

滾動時在 recyclerView 中取消選中復選框

[英]checkboxes gets unchecked in recyclerView upon scrolling

我有一個游標,它檢索成分列表並填充一個適配器,然后將其分配給具有復選框的回收器視圖。 我遇到的問題是,當我檢查一組復選框並向下滾動時,從頂部選擇的那些被取消選擇,反之亦然,或者在某些情況下,如果我從頂部選擇三個,從底部選擇三個被選中。 我需要確保最初沒有選擇任何內容,即使我上下滾動,所選的內容也應保持選中狀態並需要跟蹤。

這是可滾動的列表。

在此處輸入圖片說明

這是我的代碼:

class RecipeDetailCursorAdapter extends CursorRecyclerViewAdapter<RecyclerView.ViewHolder> {

    private int mBrownColor;
    private int mGreenColor;
    private int mCheckItems;
    private ItemsCheckedCallback mCheckedCallback;

    RecipeDetailCursorAdapter(Context context, Cursor cursor, ItemsCheckedCallback callback) {
        super(context, cursor);
        mCheckedCallback = callback;
        mBrownColor = ContextCompat.getColor(mContext, R.color.colorTextBrown);
        mGreenColor = ContextCompat.getColor(mContext, R.color.colorTextGreen);
        mCheckItems = 0;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, Cursor cursor) {
        String taskName = cursor.getString(cursor.getColumnIndexOrThrow(MascotHelper.RecipeTask.NAME));
        ((RecipeTaskHolder) viewHolder).bindView(taskName);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.recipe_task_item, parent, false);
        return new RecipeTaskHolder(v);
    }


    private class RecipeTaskHolder extends RecyclerView.ViewHolder
            implements SmoothCheckBox.OnCheckedChangeListener {

        SmoothCheckBox taskBox;
        TextView recipeComponentName;


        RecipeTaskHolder(View v) {
            super(v);
            taskBox = (SmoothCheckBox) v.findViewById(R.id.recipe_task_box);
            recipeComponentName = (TextView) v.findViewById(R.id.recipe_component_name);
            taskBox.setOnCheckedChangeListener(this);
        }


        void bindView(String task) {
            recipeComponentName.setText(task);
        }

        @Override
        public void onCheckedChanged(SmoothCheckBox smoothCheckBox, boolean b) {
            if (smoothCheckBox.isChecked()) {
                recipeComponentName.setTextColor(mBrownColor);
                mCheckItems++;
            } else {
                recipeComponentName.setTextColor(mGreenColor);
                mCheckItems--;
            }


            if (mCheckItems == getItemCount()) {
                //Toast.makeText(mContext, "All items are checked", Toast.LENGTH_SHORT).show();
                mCheckedCallback.onAllItemChecked(true);
            } else {
                mCheckedCallback.onAllItemChecked(false);
            }
        }
    }


    interface ItemsCheckedCallback {
        void onAllItemChecked(boolean status);
    }
}

任何想法或建議將不勝感激。

RecyclerView 在滾動時從布局中移除(回收)看不見的視圖,這是 recyclerView 的基本行為,以減少內存使用。

當帶有復選框的視圖被回收時,選中的復選框將被取消選中,如果它有一個偵聽器,則調用該偵聽器。

您可以在回收時從視圖中刪除偵聽器。 只需覆蓋 onViewRecycled 方法。

    @Override
    public void onViewRecycled(@NonNull MyViewHolder holder) {
        holder.checkBox.setOnCheckedChangeListener(null);
        super.onViewRecycled(holder);
    }

再次構建視圖時,在滾動時,您的偵聽器也將再次添加。

在 onBindView 上使用下面的邏輯:

holder.attenCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if (holder.attenCheckBox.isChecked())
                    dataModel.setChecked(true);
                else
                    dataModel.setChecked(false);
            }
        });

        if (dataModel.getChecked())
            holder.attenCheckBox.setChecked(true);
        else
            holder.attenCheckBox.setChecked(false);
        holder.checkboxLinearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (holder.attenCheckBox.isChecked())
                    holder.attenCheckBox.setChecked(false);
                else
                    holder.attenCheckBox.setChecked(true);
            }
        });

解釋:

  • 當您向下或向上滾動時,回收視圖會膨脹 eveytime。
  • 您需要在數據 pojo 中存儲一個標志以跟蹤檢查狀態
  • 將該標志與setOnCheckedChangeListener一起使用將使您能夠檢查enable/disable 確保在聽眾之后放置標志。
@Override
public void onBindViewHolder(MyViewHolder holder,final int position) {
   final ClassName object = objectList.get(position);
    object.checkBox.setOnCheckedChangeListener(null);
    object.checkBox.setChecked(false);
    object.checkBox.setOnCheckedChangeListener(new android.widget.CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            object.setChecked(isChecked);
        }
    });
}

這會持續地綁定視圖並保持您的檢查位置,並在視圖綁定時一次又一次地檢查它們。

希望這對你有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM