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:
- Detener el desplazamiento del usuario para establecer la posición en RecyclerView
- Configuración de la aplicación: layout_behavior mediante programación
- ¿Cómo puedo eliminar OnClickListeners de ViewHolders de RecyclerView cuando se eliminan?
- Contenido dinámico dentro de una lista en Android
- Problemas con la implementación del modo de acción contextual en fragmento recyclerview
<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.
- Android RecyclerView desplazamiento suave para ver que está animando su altura
- Recyclerview dolorosamente lento para cargar imágenes en caché de Picasso
- Problema con selector en RecycleView
- Recyclerview agregar datos a la parte superior sin desorden?
- ¿Hay observadores escritos en RecyclerView.Adapter para saber si el conjunto de datos ha sido cambiado?
- Picasso problema de extracción de imágenes cuando se utiliza con RecyclerView
- RecyclerView onClick
- Múltiples elementos seleccionados RecyclerView in Activity.java
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);