- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在使用 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/
我很好地使用了 RealmRecyclerViewAdapter。我的问题是实现一个不起作用的 Filterable。这是代码: private class AirportAdapter exten
我在使用 RealmRecyclerViewAdapter 时遇到了一个奇怪的问题。我重写了类,为初始数据指定了 null,为 autoUpdate 指定了 true。适配器已经为 RecyclerV
我正在尝试使用 SearchView 来过滤 RealmRecyclerViewAdapter 提供的列表。我已经尝试了 StackOverflow 上建议的几种方法,包括: EpicPandaFor
一直在使用 realm,它很棒。 遇到了一些事情。想知道我是否做错了什么。 我有一个 RealmRecyclerViewAdapter 用来显示 Realm 查询的结果。如果我在 Realm 中添加或
AndroidStudio 2.2.3 无法解析我的 RealmRecyclerViewAdapter 引用。我已经直接从 Realm 站点关注了 RecyclerViewAdaper 示例。有人可以
我是一名优秀的程序员,十分优秀!