Ответ 1
Вот что я хотел бы попробовать. Сначала проверьте принятый ответ на вопрос, указанный ниже. Это дает очень хорошее представление о том, как работают запросы Firebase. Я считаю, что информация доверена, так как ответ от кого-то из команды Firebase:
Как отделить начальную загрузку данных от инкрементальных детей с помощью Firebase?
Итак, на основе ответа на вопрос, связанный выше, и того факта, что FirebaseRecyclerAdapter
поддерживается FirebaseArray
, который заполняется с помощью ChildEventListener
, я бы добавил прослушиватель событий Single value в той же ссылке базы данных используется для заполнения вашего FirebaseRecyclerAdapter
. Что-то вроде этого:
//create database reference that will be used for both the
//FirebaseRecyclerAdapter and the single value event listener
dbRef = FirebaseDatabase.getInstance().getReference();
//setup FirebaseRecyclerAdapter
mAdapter = new FirebaseRecyclerAdapter<Model, YourViewHolder>(
Model.class, R.layout.your_layout, YourViewHolder.class, dbRef) {
@Override
public void populateViewHolder(YourViewHolder holder, Model model, int position){
//your code for populating each recycler view item
};
mRecyclerView.setAdapter(mAdapter);
//add the listener for the single value event that will function
//like a completion listener for initial data load of the FirebaseRecyclerAdapter
dbRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//onDataChange called so remove progress bar
//make a call to dataSnapshot.hasChildren() and based
//on returned value show/hide empty view
//use helper method to add an Observer to RecyclerView
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Это будет обрабатывать начальную настройку RecyclerView. Когда вызывающий onDataChange
вызывается в однослужебном прослушителе событий, используйте вспомогательный метод для добавления наблюдателя в FirebaseRecyclerAdapter для обработки любых последующих добавлений/удалений в местоположение базы данных.
mObserver = new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
//perform check and show/hide empty view
}
@Override
public void onItemRangeRemoved(int positionStart, int itemCount) {
//perform check and show/hide empty view
}
};
mAdapter.registerAdapterDataObserver(mObserver);