【问题标题】:RecyclerView keep on selecting random checkbox on scroll [duplicate]RecyclerView继续在滚动时选择随机复选框[重复]
【发布时间】:2018-01-12 15:34:43
【问题描述】:

我正在使用 PagedList 实时数据和 PositionalDataSource 以 mvvm 模式创建信息。我在 stackoverflow 上尝试了所有可能的解决方案,类似于它。没用。

在下面的代码中我有空指针异常:尝试在空对象引用上调用虚拟方法'..Item.getSelected()'

我已经非常小心地将它设置在 Item 类上。

@Override
public void onBindViewHolder(PageViewAdapter.PageViewHolder holder, int position) {

    item = getItem(position);
    if (item != null) {
        holder.lineTextView.setText(String.valueOf(item));
    }

    holder.checkBox.setTag(position);
    holder.checkBox.setOnCheckedChangeListener(null);
    holder.checkBox.setChecked(item.getSelected()); 
    holder.checkBox.setOnCheckedChangeListener((compoundButton, isChecked) -> {

        if (compoundButton.isPressed()) {
         // holder.checkBox.setSelected(isChecked);
            item.setSelected(isChecked);
        }
    });
}

My Data Model as Item Class 
public class Item {
 private boolean selected = true;

public Item(String value) {
    this.value = value;
}

public void setSelected(boolean selected) {
    this.selected = selected;
}

public boolean getSelected() {
    return selected;

}
}

我在 Git 上的代码:https://github.com/kumarjitendra/pageViewItem

【问题讨论】:

    标签: java android


    【解决方案1】:

    RecyclerView 表示视图被回收。当它们消失在屏幕上方时,它们会在屏幕底部重复使用。这就是为什么其中一些仍然被检查并且它会出现“随机”的原因。当您绑定到 Recycler View Adapter 中的视图时,您必须检查这一点。

    您可能会在这里找到答案:CheckBox in RecyclerView keeps on checking different items

    【讨论】:

    • 我尝试了链接中所有可能的选项。他们都没有在我的情况下工作。他们建议在一个地方使用 setSelected 和 getSelected 。在这种情况下,我在“getSelected()”处得到空指针异常,尽管我已经非常仔细地设置了谢谢
    • 在我定义 Recyclerview 的地方,我在下面添加了 2 行 recylerView.setHasFixedSize(true); recylerView.setItemViewCacheSize(X); X = 滚动时缓存的最大行数。它工作正常。感谢大家的时间和精力:)
    【解决方案2】:

    因为 RecyclerView 回收视图,所以您需要保存一些标识先前选择的项目的信息。您可以使用数据模型保存该信息,然后进行适配器检查。

    【讨论】:

    • 我已经使用了名为 "Item" 的数据模型。我仍然非常小心地使用了 setSelected 和 getSelected(),当我使用 setChecked 我的代码时,在“getSelected()”处出现空指针异常: holder.checkBox.setChecked(item.getSelected()); holder.checkBox.setOnCheckedChangeListener((compoundButton, isChecked) -> { if (compoundButton.isPressed()) { // holder.checkBox.setSelected(isChecked); item.setSelected(isChecked); } });
    • 在我定义 Recyclerview 的地方,我在下面添加了 2 行 recylerView.setHasFixedSize(true); recylerView.setItemViewCacheSize(X); X = 滚动时将缓存的最大行数。它工作正常。感谢大家的时间和精力:)
    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2019-05-05
    相关资源
    最近更新 更多