gpt4 book ai didi

android - 为什么 RealmRecyclerViewAdapter 不起作用?

转载 作者:搜寻专家 更新时间:2023-11-01 09:22:34 25 4
gpt4 key购买 nike

我在使用 RealmRecyclerViewAdapter 时遇到了一个奇怪的问题。我重写了类,为初始数据指定了 null,为 autoUpdate 指定了 true。适配器已经为 RecyclerView 注册。然后稍后在 onResume() 中我执行以下操作:

theAdapter.updateData(myQuery.findAllAsync());

但是,当我的 Activity 显示时,RecyclerView 是空的,尽管我知道有结果。当我启动调试器并进入在 RealmRecyclerViewAdapter 内部创建的监听器时,我可以看到发生了什么。 changeSet 参数中没有添加、删除或删除的范围,但 changeSet 参数也不是 null。这意味着它永远不会调用 notifyDataSetChanged()。我可以在 collection 参数中看到我的 300 多个结果。

我已经粘贴了下面的代码。 if (changeSet == null) 我认为应该为真但实际上不是的条件是。知道这里发生了什么吗?他们是否将 Realm 更改为从不返回空更改集,但忘记更新适配器?

我正在运行 Realm 5.4.1,适配器是 2.0.0。

编辑:作为实验,我在调用 updateData() 后在主线程上添加了一个 Thread.sleep(1000)。这实际上会导致 RecyclerView 填充结果,因为查询有时间在适配器开始尝试将值绑定(bind)到 View 持有者之前完成异步。这并不是一个惊喜,但我想我会分享它。

    // This is from the RealmRecyclerViewAdapter class
private OrderedRealmCollectionChangeListener createListener() {
return new OrderedRealmCollectionChangeListener() {
@Override
public void onChange(Object collection, OrderedCollectionChangeSet changeSet) {
// null Changes means the async query returns the first time.
if (changeSet == null) {
notifyDataSetChanged();
return;
}
// For deletions, the adapter has to be notified in reverse order.
OrderedCollectionChangeSet.Range[] deletions = changeSet.getDeletionRanges();
for (int i = deletions.length - 1; i >= 0; i--) {
OrderedCollectionChangeSet.Range range = deletions[i];
notifyItemRangeRemoved(range.startIndex, range.length);
}

OrderedCollectionChangeSet.Range[] insertions = changeSet.getInsertionRanges();
for (OrderedCollectionChangeSet.Range range : insertions) {
notifyItemRangeInserted(range.startIndex, range.length);
}

OrderedCollectionChangeSet.Range[] modifications = changeSet.getChangeRanges();
for (OrderedCollectionChangeSet.Range range : modifications) {
notifyItemRangeChanged(range.startIndex, range.length);
}
}
};
}

最佳答案

Realm 5.4.1 and the adapter is 2.0.0.

这就是原因。

您必须将 realm-android-adapters 更新到 3.0.0 或更新版本。


Realm-Java 5.0.0 (2018-03-15)

Breaking Changes

The OrderedCollectionChangeSet parameter in OrderedRealmCollectionChangeListener.onChange() is no longer nullable. Use changeSet.getState() instead (#5619).


Realm-Android-Adapters 3.0.0 (2018-04-06)

Breaking Changes

Only works with Realm Java 5.0.0+. (#137)

PR 说:

Add support for non-null changesets

并有以下变化:

            if (changeSet == null) {
notifyDataSetChanged();
return;
}

///////////////////////////////////////////

if (changeSet.getState() == OrderedCollectionChangeSet.State.INITIAL) {
notifyDataSetChanged();
return;
}

因此在 Realm 5.0.0+ 中,changeSet 永远不会为空,因此不会触发 notifyDataSetChanged()

关于android - 为什么 RealmRecyclerViewAdapter 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53526912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com