Mostrando vista vacía cuando ListView está vacío

Por alguna razón, la vista vacía, un TextView en este caso, siempre aparece incluso cuando el ListView no está vacío. Pensé que ListView detectaría automáticamente cuándo mostrar la vista vacía.

      

¿Cómo puedo conectar la vista vacía correctamente?

Debería ser así:

  

Tenga en cuenta el atributo id .

Cuando extienda FragmentActivity o Activity y no ListActivity , querrá consultar:

ListView.setEmptyView ()

Como dice appthatmatter, en el diseño algo así como:

   

y en la actividad vinculada:

 this.listView = (ListView) findViewById(R.id.listView); this.listView.setEmptyView(findViewById(R.id.emptyElement)); 

También funciona con un GridView …

Probé todas las soluciones anteriores. Vine resolviendo el problema. Aquí estoy publicando la solución completa.

El archivo xml :

     

El textView ( “@ + id / emptyElement” ) es el marcador de posición para la vista de lista vacía.

Aquí está el código para la página de java:

 lvmessage=(ListView)findViewById(R.id.lv_msglist); lvmessage.setAdapter(adapter); lvmessage.setEmptyView(findViewById(R.id.emptyElement)); 

Recuerde colocar la vista vacía después de vincular el adaptador a la vista de lista. La mía no funcionaba por primera vez y después de mover el setEmptyView después de setAdapter, ahora está funcionando.

Salida:

enter image description here

Te recomiendo que uses ViewStubs como este

     

Vea el ejemplo completo de Cyril Mottier

   and in the linked Activity: this.listView = (ListView) findViewById(R.id.listView); this.listView.setEmptyView(findViewById(R.id.empty)); 

Esto funciona claramente con FragmentActivity si está utilizando la biblioteca de soporte. Probado esto construyendo para la API 17, es decir, la imagen 4.2.2.

Código de actividad, es importante ampliar ListActivity .

 package com.example.mylistactivity; import android.app.ListActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import com.example.mylistactivity.R; // It's important to extend ListActivity rather than Activity public class MyListActivity extends ListActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mylist); // shows list view String[] values = new String[] { "foo", "bar" }; // shows empty view values = new String[] { }; setListAdapter(new ArrayAdapter( this, android.R.layout.simple_list_item_1, android.R.id.text1, values)); } } 

Layout xml, la identificación en ambas vistas es importante.

        

Solo para agregar que realmente no necesita crear nuevas ID, algo como lo siguiente funcionará.

En el diseño:

   

Luego en la actividad:

  ListView listView = (ListView) findViewById(android.R.id.list); listView.setEmptyView(findViewById(android.R.id.empty)); 

Tuve este problema Tuve que hacer que mi clase ampliara ListActivity en lugar de Activity, y cambie el nombre de mi lista en el XML a android:id="@android:id/list"

Primero compruebe que la lista contiene algunos valores:

 if (list.isEmpty()) { listview.setVisibility(View.GONE); } 

Si está bien, de lo contrario, use:

 else { listview.setVisibility(View.VISIBLE); }