Как отклонить индикатор выполнения, даже если нет представления о заполнении в FirebaseListAdapter?

Я использую FirebaseUI FirebaseListAdapter. Для загрузки данных требуется некоторое время, и я хочу показать круговую линию. Я могу отклонить индикатор выполнения, установив видимость видимости невидимым в populateView, но он не работает, если нет представления для заполнения. Как справиться с этим?

Ответ 1

Обновление: адаптеры FirebaseUI теперь имеют метод onDataChanged(), который вы можете переопределить, чтобы определить, когда они будут загружены набор данных.

Смотрите исходный код github. Оттуда:

Этот метод будет запускаться каждый раз, когда обновления из базы данных будут полностью обработаны. Поэтому при первом вызове этого метода загружаются исходные данные, включая случай, когда данные вообще отсутствуют. Каждый раз, когда вызывается метод, завершается полное обновление (потенциально состоящее из обновлений для нескольких дочерних элементов).

Обычно вы переопределяете этот метод, чтобы скрыть индикатор загрузки (после начальной загрузки) или завершить пакетное обновление элемента интерфейса.

Приложение примера FirebaseUI переопределяет onDataChanged(), чтобы скрыть свой индикатор загрузки:

public void onDataChanged() {
    // If there are no chat messages, show a view that invites the user to add a message.
    mEmptyListMessage.setVisibility(getItemCount() == 0 ? View.VISIBLE : View.GONE);
}

Оригинальный ответ

Адаптеры списка FirebaseUI внутренне используют Firebase ChildEventListener. Этот слушатель только срабатывает для соответствующих дочерних событий. Если детей нет, событие не будет срабатывать.

Вы можете обнаружить эту ситуацию, добавив дополнительный прослушиватель значений в ссылку/запрос, которые вы передаете в адаптер.

DatabaseReference list = mDatabase.child("messages");
showSpinner();
mAdapter = new FirebaseListAdapter<Message>(......, list) {
    void populateView(View view, Message message, int position) {
        // the first message was loaded
        hideSpinner();
    }
});
list.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        // the initial data is loaded (even if there was none)
        hideSpinner();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "onCancelled", databaseError.toException());
    }
});