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:
- Cómo rellenar la imagen dentro de ImageView por la costumbre de la izquierda y la coordenada superior | Androide
- Android RecyclerView crea y enlaza todas las vistas en el cambio de conjunto de datos
- El mejor lugar para adjuntar onClickListener en recyclerview
- Los datos del adaptador RecycleView aparecen erróneos al desplazarse demasiado rápido
- Ancho del elemento RecyclerView layout_width = "match_parent" no coincide con el padre
<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.
- Custom GridlayoutManager para WRAP_CONTENT en un RecyclerView
- Configuración dinámica de una altura fija para una vista de cuadrícula escalonada
- Alternativa a registerDataSetObserver () en RecyclerView
- Arrastrar y soltar RecyclerView que se rellena desde SQLiteDatabase
- ¿Dónde debo desvincular ButterKnife 8.xx en un ViewHolder?
- No se puede escribir un algoritmo para filtrar elementos en un RecyclerView basado en un tiempo guardado con cada elemento
- Cambiar el tamaño de una vista en OnLayoutChangeListener
- Problemas con la implementación del modo de acción contextual en fragmento recyclerview
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);