2010-11-16 9 views
12

¿Cómo usar un diseño como vista vacía para una vista de lista cuando el adaptador tiene cero elementos?Configuración de un diseño para usar como vista vacía para un ListView en caso de que el adaptador tenga cero elementos en una actividad

setEmptyView no funciona con este código:

public class ZeroItemListActivity extends Activity { 
    private ArrayList<String> listItems=new ArrayList<String>(); 
    private ListView mMyListView; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mMyListView=(ListView) findViewById(R.id.MyListView); 
     mMyListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,listItems)); 
     LayoutInflater inflator=getLayoutInflater(); 
     View emptyView=inflator.inflate(R.layout.empty_list_item, null); 
     //Empty view is set here 
     mMyListView.setEmptyView(emptyView); 
    } 
    public void addItem(View v){ 
     listItems.add("list Item"); 
     mMyListView.invalidate(); 
    } 
} 

los diseños más utilizados: empty_list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" android:layout_height="wrap_content"> 
    <Button android:id="@+id/Button01" android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:text="Empty List,Click to add items"></Button> 
</LinearLayout> 

main.xml

<?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"> 
    <TextView android:layout_width="fill_parent" 
     android:layout_height="wrap_content" android:text="@string/hello" /> 
    <ListView android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:id="@+id/MyListView"></ListView> 
    <Button android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:id="@+id/AddItemsButton" 
     android:text="Add Items" android:onClick="addItem"></Button> 
</LinearLayout> 
+3

Btw mMyListView.invalidate(); no es la llamada correcta para actualizar la lista, debe tener algo como ((ArrayAdapter) mMyListView.getAdapter()). notifyDataSetChanged(); –

Respuesta

7

El tutorial Android Dev para las cubiertas lista de actividades este tema:

Básicamente, su clase extiende ListActivity. Establezca su id de lista en @id/android:list y la id de "vista vacía" en @id/android:empty en el mismo diseño XML.

Espero que esto ayude :)

+0

puedo usar esto con linearlayout y clase de actividad –

+0

Esta solución solo es válida para ListActivity, aunque es válida, pero no aplicable a la pregunta original. –

23

La manera más fácil de hacer esto es poner la vista vacía en la disposición main.xml:

<?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"> 

     <TextView android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/hello" /> 
     <ListView android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/MyListView"> 
     </ListView> 
     <!-- empty view --> 
     <LinearLayout android:id="@+id/emptyView" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"> 

      <Button android:id="@+id/Button01" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Empty List,Click to add items"> 
      </Button> 
     </LinearLayout> 

    <Button android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/AddItemsButton" 
     android:text="Add Items" 
     android:onClick="addItem"></Button> 
    </LinearLayout> 

Luego, en el código, configurar la vista del vacío de esta manera:

mMyListView.setEmptyView(findViewById(R.id.emptyView)); 

la razón por la que su código no funciona es que el ListView y vista al vacío necesitan estar en la misma vista jerarquía. Y su llamada al inflate pasa nulo como padre, por lo que están en jerarquías diferentes.

+8

Creo que la adición de 'emptyView' a la misma jerarquía de' ListView' también se puede hacer mediante programación, llamando a '((ViewGroup) mMyListView.getParent()). AddView (emptyView)'. –

+0

, pero ¿cómo puedo colocar el oyente con un clic del botón definido en la vista vacía? –

0

Al inflar la vista, debe configurar el elemento primario de la vista para que forme parte de la jerarquía Diseño en lugar de pasar el valor nulo en algunos casos.

Reemplazar

View emptyView = inflator.inflate(R.layout.empty_list_item, null); 

con

View emptyView = inflator.inflate(R.layout.empty_list_item, (ViewGroup) mMyListView.getParent()); 

a continuación, establece la vista vacía como lo hacía antes con.

mMyListView.setEmptyView(findViewById(R.id.emptyView)); 
Cuestiones relacionadas