FirebaseRecyclerAdapter con vista vacía

Sé que hay muchas maneras de tener una vista vacía para un RecyclerView. Pero mi pregunta es para FirebaseRecyclerView.

Mi diseño es:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/feed_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" /> <ProgressBar android:id="@+id/feed_loading" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:visibility="gone"/> </RelativeLayout> 

Por lo tanto, estoy mostrando LoadingBanBar antes de que el RecyclerView llena sus elementos. Ahora qué si el servidor no tiene ningún artículo. En esta situación mi RecyclerView está siempre vacío y mi LoadingBasBar siempre visible para el usuario.

Así que en vez de mostrar el ProgressBar por tiempo indefinido, quiero mostrar algún diseño vacío. Por ejemplo, "No se han encontrado datos" o algo similar.

El resultado final debe ser: ProgressBar debe mostrarse hasta que los datos se cargan en RecyclerView y una vez que se cargan los datos ProgressBar debe ser invisible. Pero si no hay datos en el servidor, debe mostrarse algún diseño vacío en lugar de ProgressBar.

En RecyclerView normal, tenemos un conjunto de datos (algunos ArrayList, etc) y si está vacío entonces podemos mostrar ese diseño vacío. Pero en el caso de FirebaseRecyclerAdapter, no tengo la referencia de Snapshot en mi Actividad o Contexto. Tampoco tengo ninguna devolución de llamada que me diga que no hay datos presentes en el servidor.

Cualquier solución le ayudará mucho.

Esto es lo que intentaría. En primer lugar echa un vistazo a la respuesta aceptada a la pregunta vinculada a continuación. Proporciona una muy buena idea de cómo funcionan las consultas de Firebase. Yo consideraría la información confiable, ya que la respuesta es por alguien en el equipo de Firebase:

¿Cómo separar la carga inicial de datos de los niños incrementales con Firebase?

Por lo tanto, sobre la base de la respuesta a la pregunta vinculada arriba y el hecho de que el FirebaseRecyclerAdapter está respaldado por un FirebaseArray que se rellena utilizando un ChildEventListener añadiría un evento de un solo evento en la misma referencia de base de datos utilizada para rellenar su FirebaseRecyclerAdapter . Algo como esto:

 //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) { } }); 

Eso manejaría la disposición inicial del RecyclerView. Cuando onDataChange se llama al detector de eventos de valor único, utilice un método auxiliar para agregar un observador al FirebaseRecyclerAdapter para manejar cualquier adición / eliminación posterior a la ubicación de la base de datos.

 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); 
  • App fallando al intentar usar RecyclerView en android 5.0
  • SwipeRefreshLayout cargador no sube cuando tire hacia abajo de Android
  • RecyclerView no se actualiza después de NotifyDataSetChanged (), el contenido aparece después de encender y apagar la pantalla
  • ¿Cómo puedo eliminar OnClickListeners de ViewHolders de RecyclerView cuando se eliminan?
  • Reciclaje multi-expansible
  • Clic en el elemento programáticamente en RecyclerView
  • Haciendo Recyclerview la altura fija y Scrollable
  • Los elementos no tienen el mismo ancho cuando se utiliza RecyclerView GridLayoutManager para establecer el espaciado de columnas por ItemDecoration
  • Cómo usar el mismo Adaptador RecyclerView para diferentes diseños
  • ¿Qué es alertcontroller.recyclelistview
  • Java.lang.IllegalStateException: RecyclerView no tiene LayoutManager en Fragmento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.