android - 在 Recylerview 中实现复选框。 MVVM Room ViewModel LiveData Recylerview 复选框

标签 android android-recyclerview android-room android-viewmodel

我已经使用 Room、ViewModel、LiveData、Recylerview 实现了一个 MVVM 模式的 android java 应用程序。

  1. recyclerview 有一个项目列表,每个项目中都有一个复选框。
  2. 当启用或禁用 recyclerview 项目的复选框时, 模型通过 ViewModel 在房间数据库中更新。
  3. 在每个 recyclerview 上监听复选框启用或禁用事件 项目,我已经实现了 OnCheckedChangeListener。

有 1 或 2 个项目的 recyclerview 没问题,

但是当 recyclerview 项目增加时,比如 >10 个项目,当我启用或禁用复选框时,recyclerview 中的其他项目也会受到影响。

例如:

如果我更改项目 [5] 处的复选框(项目 ID 为 21,启用复选框), 它还会为其他项目触发 OnCheckedChangeListener,例如项目 [1](项目 ID 为 15,启用复选框)和项目 [8](项目 ID 为 18,启用复选框)。

日志:

2019-04-25 11:15:33.343 9890-9890/com.hardian.mvvm.sample D/RVAdapter: setOnCheckedChange--- ID :21 isRetryEnabled; false isChecked true
2019-04-25 11:15:33.405 9890-9890/com.hardian.mvvm.sample D/RVAdapter: setOnCheckedChange--- ID :15 isRetryEnabled; false isChecked true
2019-04-25 11:15:33.415 9890-9890/com.hardian.mvvm.sample D/RVAdapter: setOnCheckedChange--- ID :18 isRetryEnabled; false isChecked true

代码:在我的 StatusRecyclerViewAdapter 中

 @Override
    public void onBindViewHolder(StatusViewHolder holder, int position) {
        StatusItem  statusItem = mDataSet.get(position);

        if (statusItem != null) {
            cbStatus.setChecked(statusItem.isRetryEnabled());

            cbStatus.setOnCheckedChangeListener((buttonView, isChecked) -> {
                Log.d("RVAdapter", "setOnCheckedChange--- ID :" + statusItem.getId()+ " isRetryEnabled; "+statusItem.isRetryEnabled()+" isChecked "+isChecked);
                //update the model via the activitiy's viewmodel through the onStatusCheckBoxChangeListener interface.
                if (onStatusCheckBoxChangeListener != null)
                    onStatusCheckBoxChangeListener.onStatusCheckBoxChanged(statusItem,isChecked);
            });

        }
    }

我需要一个解决方案来解决 Recylerview 回收的这个问题。

注意: 我试过this.setIsRecyclable(false);,它解决了这个问题,但不推荐,我需要找到另一种机制来避免这种情况。

最佳答案

  1. 将标签设置为您的复选框并从标签中获取项目。
  2. 不要使用 setOnCheckedChangeListener,而是使用 setOnClickListener。

代码:

cbStatus.setTag(statusItem);
cbStatus.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        CheckBox cb = (CheckBox) v;
        StatusItem item = (StatusItem) cb.getTag();
        if (onStatusCheckBoxChangeListener != null)
            onStatusCheckBoxChangeListener.onStatusCheckBoxChanged(item,cb.isChecked());
    }
});

关于android - 在 Recylerview 中实现复选框。 MVVM Room ViewModel LiveData Recylerview 复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55852816/

相关文章:

android - Retrofit 和 RecyclerView 在启动时不显示项目

android - 在 RecyclerView 上与 ViewPager 同步显示所选项目

java - 在特定 ID Room Android 处插入行

java - 更新 LiveData 返回的对象属性

android - 如何创建将 LocalDate 转换为 Room 可以理解/保存的格式的 TypeConverter?

android - 如何在 OpenGL ES 1.1 中处理索引缓冲区

android - 如何修复 "Failed to package application"和 "android/res"错误?

android - 如何在 Android 中以编程方式创建菜单?

java - 列表上的空对象引用

android - 如何让 Espresso 点击特定的 RecyclerView item?