Tengo un ListView
. Los datos que hay detrás se obtienen de Internet, en conjuntos de 10 a 30 elementos, siempre que el usuario se desplaza hasta el final. Para indicar que está cargando más elementos, solía addFooterView()
agregar una vista simple que muestra un mensaje "Cargando ..." y una ruleta. Ahora, cuando me quedo sin datos (no hay más datos para recuperar), quiero ocultar ese mensaje. Intenté hacer:
loadingView.setVisibility(View.GONE);
Desafortunadamente, si bien eso oculta la vista, le deja espacio. Es decir, termino con un gran espacio en blanco donde solía estar el mensaje "Cargando". ¿Cómo puedo ocultar correctamente esta vista?
No puedo usar removeFooterView()
porque es posible que deba mostrarlo nuevamente, en cuyo caso no puedo addFooterView()
volver a llamar porque ya se ha configurado un adaptador en el ListView
, y no puede llamar addHeaderView()
/ addFooterView()
después de configurar un adaptador.
Intente establecer la altura del pie de página en 0px o 1px antes de ocultarlo. Alternativamente, envuelva la vista de pie de página en una
wrap_content
alturaFrameLayout
y oculte / muestre la vista interior, dejandoFrameLayout
visible; la altura debe envolver correctamente entonces.fuente
en mi caso addFooterView / removeFooterView () causa algunos artefactos. Y encontré otra solución. Usé FrameLayout como FooterView. Y cuando quiero agregar Footer, llamé mFrameFooter.addView (myFooter); y mFrameFooter.removeAllViews (); para quitar.
FrameLayout frameLayout = new FrameLayout(this); listView.addFooterView(frameLayout); ...... ...... //For adding footerView frameLayout.removeAllViews(); frameLayout.addView(mFooterView); //For hide FooterView frameLayout.removeAllViews();
fuente
La biblioteca Droid-Fu tiene una clase diseñada para mostrar y ocultar un pie de página de carga: ListAdapterWithProgress .
fuente
Funciona bien en mi proyecto:
1.Añadir primero la vista de pie de página
mListView.addFooterView(mFooterView); mListView.setAdapter(mAdapter);
2.Establecer visibilidad
mFooterView.setVisibility(View.GONE); mFooterView.setPadding(0, 0, 0, 0);
3.Configurar la invisibilidad
mFooterView.setVisibility(View.GONE); mFooterView.setPadding(0, -1*mFooterView.getHeight(), 0, 0);
fuente
Como señaló @YoniSamlan, se puede lograr de una manera sencilla. Tienes que especificar
android:layout_height="wrap_content"
en ViewGroup que contiene el botón "Cargar más". No tiene que ser FrameLayout, vea a continuación un ejemplo simple de trabajo que usa LinearLayout.
Ambas imágenes muestran una pantalla que se desplaza hasta el final. El primero tiene un pie de página visible que envuelve el botón "cargar más". Las segundas imágenes muestran que el pie de página se colapsa si configura la visibilidad del botón en GONE.
Puede volver a mostrar el pie de página (dentro de alguna devolución de llamada) cambiando la visibilidad:
loadMore.setVisibility(View.VISIBLE); // set to View.GONE to hide it again
Realice la inicialización de listView como de costumbre
// Find View, set empty View if needed mListView = (ListView) root.findViewById(R.id.reservations_search_results); mListView.setEmptyView(root.findViewById(R.id.search_reservations_list_empty)); // Instantiate footerView using a LayoutInflater and add to listView footerView = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE)) .inflate(R.layout.load_more_footer_view, null, false); // additionally, find the "load more button" inside the footer view loadMore = footerView.findViewById(R.id.load_more); loadMore.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { fetchData(); } }); // add footer view to the list mListView.addFooterView(footerView); // after we're done setting the footerView, we can setAdapter adapter = new ReservationsArrayAdapter(getActivity(), R.layout.list_item_reservations_search, reservationsList); mListView.setAdapter(adapter);
load_more_footer_view.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/load_more" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="9dp" android:gravity="center" android:layout_gravity="center" android:background="@drawable/transparent_white_border" android:textColor="@android:color/white" android:text="@string/LOAD_MORE"/>
fuente
Debería ser un error de Android.
No es necesario eliminar o agregar una vista de pie de página de forma dinámica. Solo necesita crear un diseño principal de altura no especificado (inflarlo desde un archivo xml o crearlo programáticamente) y luego agregar la vista que desea ocultar o mostrar en él.
Y puede configurar la vista, pero NO el diseño principal, en VISIBLE o GONE o algo más ahora. Esto funciona para mi.
fuente
Usado
footer.removeAllViews();
Esto no elimina el pie de página, pero elimina a los niños. De nuevo hay que repoblar a los niños. Puede comprobar por
footer.getChildCount()<2
fuente
También descubrí que es posible llamar
onContentChanged()
(si lo usaListActivity
) para forzar la recreaciónListView
si necesito agregarlosHeaderView
después de lasetAdapter()
llamada, pero es un truco muy feo.fuente
He creado un ListView que maneja esto. También tiene una opción para usar EndlessScrollListener que he creado para manejar vistas de lista interminables, que carga datos hasta que no hay más datos para cargar.
Puedes ver estas clases aquí:
https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/helper/ListViewWithLoadingIndicatorHelper.java - Ayudante para hacer posible el uso de características sin ampliar desde SimpleListViewWithLoadingIndicator.
https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/listener/EndlessScrollListener.java : escucha que comienza a cargar datos cuando el usuario está a punto de llegar al final de ListView.
https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/view/SimpleListViewWithLoadingIndicator.java - The EndlessListView. Puede utilizar esta clase directamente o ampliarla.
fuente
Tengo una pequeña forma de hackear para resolver este problema en todas partes. Coloque la vista de lista y la vista de pie de página (solo diseño secundario) en el diseño principal como LinnearLayout, recuerde que la vista de pie de página debajo de la vista de lista.
Controle esta vista de pie de página desaparecida y visibilidad como vista normal. ¡Y hecho!
fuente
primero estoy agregando mi pie de página a la vista de lista, así
listView.addFooterView(Utils.b);
Luego, al hacer clic en el botón, elimino la vista,
listView.removeFooterView(Utils.b);
Estoy agregando el pie de página cada vez que presiono el async, y no hay una entrada duplicada.También podría verificar el recuento y así es así,
if(listView.getFooterViewsCount() > 0){//if footer is added already do something}
fuente
Cuando desee eliminar el pie de página en
ListView
simplemente llamelistView.addFooterView(new View(yourContext));
Agregará una vista vacía ficticia que no reservará ningún espacio
fuente