Почему RealmRecyclerViewAdapter не работает? - PullRequest
0 голосов
/ 28 ноября 2018

У меня странная проблема с 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);
            }
        }
    };
}

1 Ответ

0 голосов
/ 29 ноября 2018

Область 5.4.1 и адаптер 2.0.0 .

Вот почему.

Вынеобходимо обновить realm-android-adapters до 3.0.0 или новее.


Realm-Java 5.0.0 (2018-03-15)

Прерывание изменений

Параметр OrderedCollectionChangeSet в OrderedRealmCollectionChangeListener.onChange () больше не может иметь значение null.Вместо этого используйте changeSet.getState () (# 5619).


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

Срочные изменения

Работает только с Realm Java 5.0.0+.( # 137 )

Где PR говорит:

Добавить поддержку ненулевых наборов изменений

Иимеет следующие изменения:

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

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

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

Таким образом, в Realm 5.0.0+ набор изменений никогда не равен нулю, поэтому notifyDataSetChanged() не запускается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...