У меня странная проблема с RealmRecyclerViewAdapter
.Я переопределяю класс, указав null
для исходных данных и true
для autoUpdate
.Адаптер уже зарегистрирован для RecyclerView.Затем в onResume()
я выполняю следующее:
theAdapter.updateData(myQuery.findAllAsync());
Однако, когда отображается моя активность, RecyclerView становится пустым, несмотря на то, что я знаю, что результаты есть.Когда я запускаю отладчик и захожу в прослушиватель, созданный внутри RealmRecyclerViewAdapter
, я вижу, что происходит.В аргументе changeSet
нет диапазонов для добавления, удаления или удаления, но аргумент changeSet
также не является null
.Это означает, что он никогда не вызывает notifyDataSetChanged()
.Я могу увидеть мои 300+ результатов в аргументе collection
.
Я вставил приведенный ниже код.Условие, которое я предполагаю, должно быть верным, но это не так, это if (changeSet == null)
.Есть идеи, что здесь происходит?Они изменили Realm, чтобы никогда не возвращать нулевой набор изменений, но забыли обновить адаптер?
Я использую Realm 5.4.1, а адаптер 2.0.0.
Редактировать: какэксперимент, я добавил Thread.sleep(1000)
в основной поток после вызова updateData()
.Это фактически заставляет RecyclerView заполняться результатами, потому что у запроса есть время завершить асинхронную синхронизацию, прежде чем адаптер начнет пытаться привязать значения к держателям просмотра.Это не удивительно, но я решил поделиться этим.
// 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);
}
}
};
}