SetEmptyView en ListView no mostrar su vista en una aplicación para Android

Hola tengo un problema con el método setEmptyView de un ListView.

Aquí está mi código Java:

ListView view = (ListView)findViewById(R.id.listView1); view.setEmptyView(findViewById(R.layout.empty_list_item)); ArrayAdapter<Session> adapter1 = new ArrayAdapter<Session>(this, android.R.layout.simple_list_item_1, android.R.id.text1, MainController.getInstanz().getItems()); view.setAdapter(adapter1); 

Empty_list_item:

 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/emptyList" > </TextView> 

vista de la lista:

 <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" > 

¿Qué está mal con mi código? Cuando tengo artículos los veo en la lista. Pero cuando la lista está vacía no veo el TextView .

Su TextView debe colocarse justo debajo del elemento ListView con su conjunto de visibilidad definido (android: visibility = "gone"), no lo coloque en otro diseño. Así es como se vería su diseño principal

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/listViewFangbuch" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> <TextView android:id="@+id/empty_list_item" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" android:text="@string/emptyList" > </TextView> </LinearLayout> 

Y así es como podría verse tu código

 ListView view = (ListView)findViewById(R.id.listViewFangbuch); view.setEmptyView(findViewById(R.id.empty_list_item)); ArrayAdapter<Session> adapter1 = new ArrayAdapter<Session>(this, android.R.layout.simple_list_item_1, android.R.id.text1, MainController.getInstanz().getItems()); view.setAdapter(adapter1); 

El problema es, tengo que hacer un addContentView:

 View empty = getLayoutInflater().inflate(R.layout.empty_list_item, null, false); addContentView(empty, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); view.setEmptyView(empty); 

Ahora está bien

Para mí, ninguna de estas respuestas funcionó para mí. Lo que tenía que hacer era añadir la vista vacía manualmente (inflada) a la vista "padre" del ListView:

 ListView my_list = (ListView) findViewById(R.id.my_list); View emptyView = getLayoutInflater().inflate(R.layout.empty_view,null); ((ViewGroup)my_list.getParent()).addView(emptyView); listView.setEmptyView(emptyView); 

La forma más sencilla de usar setEmptyView() es con su "vacío" TextView y ListView en el mismo diseño como este:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/empty_list_item" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/emptyList" android:visibility="gone" /> </LinearLayout> 

Ahora puede utilizar:

 view.setEmptyView(findViewById(R.id.empty_list_item)); 

Después de probar todas las soluciones presentadas aquí y experimentar, creo que el código que aparece a continuación es el mejor método para usar cuando su ListView y View vacío no están lado a lado en un diseño con los identificadores automáticos establecidos.

 ViewGroup parentGroup = (ViewGroup)getListView().getParent(); View empty = getActivity().getLayoutInflater().inflate(R.layout.list_empty_view, parentGroup, false); parentGroup.addView(empty); getListView().setEmptyView(empty); 

Razonamiento:

  • Al pasar el grupo de padres a inflar, se respetan los atributos layout_ * de su diseño de vista vacía
  • Al no adjuntar la vista en inflar (el parámetro falso), se devuelve la vista vacía. De lo contrario, inflar devolverá al padre que nos requiera usar parentGroup.findViewById (empty_view_id) para obtener la vista vacía para usar con setEmptyView (). Aquí evitamos la búsqueda adicional, la necesidad de otro id, y la necesidad de exponer ese id en nuestro código. Si no necesitamos preservar la referencia a vacío, decir inflar a adjuntar sería la acción correcta eliminando la necesidad de la llamada addView.
  • Un anti-patrón, addContentView (), no es el enfoque correcto. Aparecerá equivalente mientras tu ListView ocupe todo el espacio visible de tu actividad. En lugar de que tu vista vacía sea un hermano de tu ListView, termina siendo un hermano de tus otros diseños de nivel raíz en tu Actividad. Parece que funciona porque está flotando (z-order) en la parte superior de todas las demás vistas de la actividad. Vea: Activity.addContentView (View) == ViewGroup.addContentView (View)?

El núcleo del problema es que la clase AdapterView realmente no agrega la vista que pasas a setEmptyView () a ningún contenedor. Simplemente cambia la visibilidad. Hay muchas maneras de poner su objeto de "vista vacía" en un contenedor, como las otras respuestas describen.

La documentación de AdapterView debe ser actualizada para reflejar esto, ya que no es obvio.

Cree un diseño en XML que especifique el ListView y la vista vacía que desee utilizar. Si les das ID de @android:id/list y @android:id/empty , android usará automáticamente la vista con id:empty cuando la lista esté vacía.

Hay algunas soluciones correctas, pero creo que este es el mejor enfoque!

 View emptyView = getLayoutInflater().inflate(R.layout.empty_list_cart, null); addContentView(emptyView, listView.getLayoutParams()); // You're using the same params as listView listView.setEmptyView(emptyView); listView.setAdapter(adapter); 

También estos dos métodos me ayudaron con la visualización de vista vacía:

  adapter.notifyDataSetChanged(); list.invalidateViews(); 

Solo usa,

 View emptyView = getLayoutInflater().inflate(R.layout.empty_view, null); ((ViewGroup)listView.getParent()).addView(emptyView); 

En lugar de listView.setEmptyView(emptyView);

Mi problema era, que agregué una opinión del pie de página que no parece trabajar con la visión vacía. Después de eliminar la vista de pie de página, se muestra la vista vacía.

Acabo de aprender android, pero el fragmento de https://developer.android.com/guide/topics/ui/layout/listview.html representa un enfoque diferente:

 // Create a progress bar to display while the list loads ProgressBar progressBar = new ProgressBar(this); progressBar.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER)); progressBar.setIndeterminate(true); getListView().setEmptyView(progressBar); // Must add the progress bar to the root of the layout ViewGroup root = (ViewGroup) findViewById(android.R.id.content); root.addView(progressBar); 

ViewGroup root = (ViewGroup) findViewById (android.R.id.content);

  • Android ListView thumb ScrollBar
  • Preseleccionar elementos en listView Android
  • ¿Cómo establecer la posición fija para el botón de acción flotante por encima de listview muy larga en android?
  • ViewHolder ArrayIndexOutOfBoundsException: longitud = 2; Índice = 2
  • Cambiar la lista seleccionada ver ítem problema de la imagen en android
  • ¿Cómo saber qué elemento de la lista es visible para el usuario?
  • Cómo puedo tamaño de forma automática listview para que no se desplaza
  • Cómo crear listview con categorías / segmentos?
  • ListView OnItemClickListener no responde?
  • ¿Cómo puedo inhabilitar el sonido de clic cuando se utiliza un elemento de vista de lista de Android / Java?
  • Lista de Android Ver Arrastrar y soltar ordenar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.