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:
- Android EditText dentro de ListView?
- Personalización de los colores de Android ListView?
- Aparece una imagen incorrecta en mis filas ListView
- Android ListView - pequeña línea entre los elementos
- ListFragment Elemento de fondo seleccionado
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
.
- Lista personalizada con dos botones en cada fila
- Cómo mostrar letras alfabéticas en el lado de Android ListView
- ListSelector de Android todavía parcialmente visible cuando el elemento se desplaza hacia fuera
- Lista de reproducción de Youtube mostrada en ListView
- Diseño relativo verificable como elemento en la lista de selección múltiple
- Android listview diferentes vistas para cada elemento
- Android ListView obtiene el valor de TextView en la posición en la que se hace clic en el botón de alternar
- Android ListView en Actividad que se refresca en el cambio de orientación
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);
- ¿Cómo imitar el estilo de diseño de material levantado estilo de botón, incluso para pre-Lollipop (menos los efectos especiales)?
- ¿Cómo puedo detener la salida de LogCat de desplazarse automáticamente en Eclipse?