2010-09-22 17 views
129

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

<RelativeLayout android:id="@+id/LinearLayoutAR" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent"> 
    <ListView android:id="@+id/ARListView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"></ListView> 
    <ProgressBar android:id="@+id/arProgressBar" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true"></ProgressBar> 
    <!-- Here is the view to show if the list is emtpy --> 
    <TextView android:id="@id/android:empty" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:text="No Results" /> 
</RelativeLayout> 

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

Respuesta

127

Debería ser así:

<TextView android:id="@android:id/empty" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:text="No Results" /> 

Nota del Identificación del atributo.

+0

he cambiado el XML a la siguiente, pero aún así obtener los mismos resultados –

+69

que se tienen que usar un ListViewActivity de funciona de esta manera – schwiz

+2

oh veo, mi ListView está realmente dentro de un ViewFlipper. ¿Hay alguna otra manera en que puedo presentar la vista cuando la lista está vacía? –

185

Al ampliar o FragmentActivityActivity y noListActivity, tendrá que echar un vistazo a:

ListView.setEmptyView()

+1

esto funciona también cuando extiendo SherlockActivity –

+0

alguna idea de cómo hacer eso en el inventor de la aplicación? – JinSnow

112

Como appsthatmatter dice, en la disposición algo como:

<ListView android:id="@+id/listView" ... /> 
<TextView android:id="@+id/emptyElement" ... /> 

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 ...

+4

Después de al menos una hora de probar varias cosas, y no tener nada funciona (mostrando el texto "vacío" además de los datos en la vista de lista), esto funcionó para mí al usar un ListView en una actividad en lugar de extender ListActivity. Gracias Eddy! –

+0

¿Debo ocultar el TextView o algo así? –

+10

@Harsha android: visibility = "ido" – scragar

4

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

6

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<String>(
       this, 
       android.R.layout.simple_list_item_1, 
       android.R.id.text1, 
       values)); 
    } 
} 

Diseño xml, la identificación en ambas vistas es importante.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <!-- the android:id is important --> 
    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 

    <!-- the android:id is important --> 
    <TextView 
     android:id="@android:id/empty" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:text="i am empty"/> 
</LinearLayout> 
8
<ListView android:id="@+id/listView" ... /> 
<TextView android:id="@+id/empty" ... /> 
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 API 17, es decir, imagen 4.2.2.

15

le recomiendo que utilice ViewStubs como esto

<FrameLayout 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" > 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

    <ViewStub 
     android:id="@android:id/empty" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout="@layout/empty" /> 
</FrameLayout> 

Vea el ejemplo completo de Cyril Mottier

+2

El ejemplo de Cyril Mottier es genial con una explicación completa. –

-4

primer lugar, compruebe la lista contiene algunos valores:

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

Si es entonces bien, de lo contrario usar:

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

¿te gustaría elaborar más lo que es una "lista"? – Roylee

+0

Es un ArrayList

+0

Objeto [] response = Utility.parseStationresponce (objeto); int statusCode = (Entero) respuesta [0]; \t @SuppressWarnings ("desmarcado") \t ArrayList list = (ArrayList ) respuesta [2]; –

33

Probé todos los solutions.I arriba ha llegado hasta la resolución de la issue.Here estoy publicando la solución completa.

El archivo XML :

<RelativeLayout 
    android:id="@+id/header_main_page_clist1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_margin="20dp" 
    android:paddingBottom="10dp" 
    android:background="#ffffff" > 

    <ListView 
     android:id="@+id/lv_msglist" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:divider="@color/divider_color" 
     android:dividerHeight="1dp" /> 

    <TextView 
     android:id="@+id/emptyElement" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:text="NO MESSAGES AVAILABLE!" 
     android:textColor="#525252" 
     android:textSize="19.0sp" 
     android:visibility="gone" /> 
</RelativeLayout> 

El Textview ("@ +/Identificación del emptyElement") es el marcador de posición para la vista de lista vacía.

Aquí es el código de la página de Java:

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

se recomienda colocar la emptyView después de la unión del adaptador al listview.Mine no estaba funcionando por primera vez y después moví el setEmptyView después de la setAdapter Ahora se trabajando.

Salida:

enter image description here

7

sólo para añadir que realmente no necesita para crear nuevos ID, algo así como el siguiente trabajo.

En el diseño:

<ListView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@android:id/list"/> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@android:id/empty" 
    android:text="Empty"/> 

Luego, en la actividad:

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