Как отклонить индикатор выполнения, даже если в 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());
}
});