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); 
  • RecyclerView ItemTouchHelper Action_Drag_Ended?
  • Android Studio 2.2.2 error "No se puede localizar el modo 0" en la visualización de renderizado después de la actualización
  • Enumera el alineamiento de elementos con Recycler View
  • ¿Cómo obtener la vista en RecyclerView.Adapter para Snackbar?
  • Extraño comportamiento de las imágenes en RecyclerView
  • RecyclerView.onBindViewHolder sólo se llama una vez
  • El adaptador de RecyclerView notifyDataSetChanged no funciona
  • AdView adjunto al fondo no me permite ver el último elemento en Recyclerview
  • ¿Recyclerview hace que el último elemento agregado sea el elemento seleccionado?
  • Comportamiento extraño de RecyclerView después de eliminar el elemento
  • Implementar una vista ampliable Android Recycler con encabezados pegajosos, función de búsqueda, selector lateral alfabético y Swipable Items / tarjetas?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.