java - 滚动时复选框在 recyclerView 中未选中

标签 java android

我有一个光标,它检索成分列表并填充适配器,然后将其分配给具有复选框的回收器 View 。我遇到的问题是,当我检查一组复选框并向下滚动时,从顶部选择的那些会被取消选择,反之亦然,或者在某些情况下,如果我从顶部选择三个,从底部选择三个被选中。我需要确保最初没有选择任何内容,即使我向上和向下滚动,选择的那些也应该保持选中状态并且需要跟踪。

这是可滚动的列表。

enter image description here

这是我的代码:

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 在滚动时从布局中移除(回收)看不见的 View ,这是 recyclerView 的基本行为,以减少内存使用。

当一个带有复选框的 View 被回收时,一个选中的复选框被取消选中,如果它有一个监听器,监听器被调用。

您可以在回收时从 View 中删除监听器。只需覆盖 onViewRecycled 方法。

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

当再次构建 View 时,在滚动时,您的监听器也将再次添加。

关于java - 滚动时复选框在 recyclerView 中未选中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42159900/

相关文章:

java - 修复 android.view.InflateException

android - 带有可折叠工具栏的 WebView? ( Material 设计)

java - 如何使非原始类成员不可变

java - 有没有办法在 javascript 中验证表单以停止 onSubmit() java 方法触发?

java - 如何使用 Jsoup 将数据发送到 ajax 函数

javascript - 云HTTPS函数: returning a Promise which is inside a Promisee

android - 重命名已发布的 Android 应用程序是否有任何影响?

java - 使用 Java 8 Streams API 打乱整数列表

java - 如何在 java 中创建证书 pfx 文件?

android - 下载 map 以供离线使用