2010-11-30 18 views
77

Tengo ListView. Los datos que se encuentran detrás se obtienen de Internet, en conjuntos de 10-30 elementos cada vez que el usuario se desplaza hasta el final. Para indicar que está cargando más elementos, utilicé addFooterView() para agregar una vista simple que muestra un mensaje "Cargando ..." y una rueda giratoria. Ahora, cuando me quedo sin datos (no más datos para recuperar), quiero ocultar ese mensaje. Traté de hacer:¿Ocultar vista de pie de página en ListView?

loadingView.setVisibility(View.GONE); 

Desafortunadamente, si bien oculta la vista, deja espacio para ella. Es decir. Terminé con un gran espacio en blanco donde solía estar el mensaje "Cargando". ¿Cómo puedo ocultar adecuadamente esta vista?

no puedo usar removeFooterView() porque puede que tenga que mostrar de nuevo, en cuyo caso no puedo llamar de nuevo porque addFooterView() un adaptador ya se ha establecido en la ListView, y no se puede llamar addHeaderView()/addFooterView() después configurando un adaptador

Respuesta

83

Parece que se le permite llamar addHeaderView()/addFooterView()despuéssetAdapter(), siempre y cuando se llama a uno de esos métodos al menos una vez antes de. Esa es una decisión de diseño bastante pobre de Google, así que yo filed an issue. Combina esto con removeFooterView() y tienes mi solución.

+1 para las otras dos respuestas que obtuve, son soluciones válidas (y posiblemente más correctas). El mío, sin embargo, es el más simple, y me gusta la simplicidad, así que marcaré mi propia respuesta como aceptada.

+6

Esto no parece funcionar para Encabezados. Puedo agregar un pie de página después de setAdapter, pero no un encabezado. – cottonBallPaws

+1

+1 para ahorrar un ENORME dolor de cabeza. Me pregunto cuánto tiempo me habría llevado imaginar que tenía que agregar el pie de página antes de configurar el adaptador. (tonto) –

+0

Me he dado cuenta de que la posición de desplazamiento se restablece cuando quita la de abajo, por lo que cuando se desplaza en exceso -> se quita el pie de página antes de terminar de desplazar, vuelve al final de la lista. ¿Te encontraste con esto? – Vadi

37

Intente establecer la altura del pie de página en 0px o 1px antes de ocultarlo. De forma alternativa, ajuste la vista del pie de página en un wrap_content altura FrameLayout y oculte/muestre la vista interior, dejando el FrameLayout visible; la altura debe envolverse adecuadamente luego.

+0

¿Cómo se fuerza el alto de la vista? Intenté setMinimumHeight (0); antes de esconderse, pero no parece funcionar. Lo configuré en GONE, pero el espacio de la celda aún se queda atrás. – Maurice

+0

El alto y el ancho son parámetros de diseño, por lo que debe establecer el objeto LayoutParameters para la vista con el nuevo ancho/alto. Vea esta respuesta SO: http://stackoverflow.com/a/2767142/59058. Básicamente, el ancho, el alto y los márgenes son propiedades que realmente se aplican al contenedor de la vista, no a la vista en sí, por lo que utiliza un objeto LayoutParameter vinculado a padres para definirlas. –

+0

No creo que funcione para un encabezado, obtuve un nulo en un encabezado que se adjuntó y se llamó getLayoutParams() para. – Vadi

4

La biblioteca Droid-Fu tiene una clase diseñada para mostrar y ocultar el pie de página de carga: ListAdapterWithProgress.

+2

Con un ejemplo de uso, esta respuesta habría ganado más votos. –

0

Usado

footer.removeAllViews(); 

Esto no elimina pie de página, pero rubores niños. De nuevo tiene que volver a llenar los niños. Puede comprobar por

footer.getChildCount()<2 
0

también he encontrado que es posible llamado onContentChanged() (si se utiliza ListActivity) para obligar a recrear ListView si necesito añadir HeaderView a ellos después de setAdapter() llamada, pero es muy feo corte.

1

Cuando se desea eliminar el pie de página en ListView sólo llamar

listView.addFooterView(new View(yourContext)); 

se agregará una vista vacía ficticia que no reservar cualquier espacio

+0

documentación dice "Si addFooterView se llama más de una vez, las vistas aparecerán en el orden en que se agregaron". – max4ever

0

He creado un ListView que se encarga de esto. También tiene una opción para usar el EndlessScrollListener que he creado para manejar listas de visitas infinitas, que carga datos hasta que no haya más datos para cargar.

Se puede 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 que sea posible el uso de las características sin que se extiende 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. Puedes usar esta clase directamente o extender desde ella.

5

en mi caso addFooterView/removeFooterView() causa algunos artefactos. Y encontré otra solución. Usé FrameLayout como FooterView. Y cuando quiero agregar un pie de página llamé a mFrameFooter.addView (myFooter); y mFrameFooter.removeAllViews(); para eliminar.

FrameLayout frameLayout = new FrameLayout(this); 
listView.addFooterView(frameLayout); 
...... 
...... 
//For adding footerView 
frameLayout.removeAllViews(); 
frameLayout.addView(mFooterView); 
//For hide FooterView 
frameLayout.removeAllViews(); 
+0

Trabajando como un encanto. Debería ser la respuesta aceptada :) –

2

Como señaló @YoniSamlan, se puede lograr de una manera sencilla. Debe especificar

android:layout_height="wrap_content" 

en el Grupo de visualización que contiene el botón "Cargar más". No tiene que ser FrameLayout, ver abajo un ejemplo simple de trabajo que usa LinearLayout.

Ambas imágenes muestran una pantalla que se desplaza hasta la parte inferior. 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 derrumba si configura la visibilidad del botón en GONE.

Puede mostrar de nuevo el pie de página (dentro de algunas de devolución de llamada) cambiando la visibilidad:

loadMore.setVisibility(View.VISIBLE); // set to View.GONE to hide it again 

listView with visible footer listView with footer gone

realizar la inicialización 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"/> 

2

Debe ser un error de Android.

No es necesario eliminar o agregar la vista de pie de página de forma dinámica. Solo tiene que crear una distribución principal de altura no especificada (bien inflarla desde un archivo xml o crearla programáticamente) y luego agregar la vista que desee ocultar o mostrar en ella.

Y puede configurar la vista, pero NO el diseño principal, para VISIBLE o GONE o alguna otra cosa ahora. Esto funciona para mi.

0

Tengo una pequeña forma de hack para resolver este problema en todas partes. Ponga la vista de lista y pie de página (solo subdisposición) en el diseño principal como LinnearLayout, recuerde esa vista de pie de página debajo de la vista de lista.

Controlador de esta vista de pie de página y visibilidad como vista nomal. ¡Y hecho!

3

funciona bien en mi proyecto:

1.Add Pie de primera visibilidad

mListView.addFooterView(mFooterView); mListView.setAdapter(mAdapter);

2.Set

mFooterView.setVisibility(View.GONE); mFooterView.setPadding(0, 0, 0, 0);

3.Set invisibilidad

mFooterView.setVisibility(View.GONE); mFooterView.setPadding(0, -1*mFooterView.getHeight(), 0, 0);

0

primera añado mi pie de página a la vista de lista, como este

listView.addFooterView(Utils.b); 

Luego, el clic de botón, se quita la vista,

listView.removeFooterView(Utils.b); 

Estoy añadiendo el cada vez de pie cuando estoy presionando la asincrónica, y no hay entrada duplicada. También podría verificar el recuento y así lo desea,

if(listView.getFooterViewsCount() > 0){//if footer is added already do something} 
Cuestiones relacionadas