2010-11-03 10 views
31

Tengo un ListView que puede tener 0 artículos personalizados dentro (como "Mis descargas").Android ListView: texto predeterminado cuando no hay elementos

¿Hay alguna forma de mostrar un texto predeterminado "Sin descarga todavía"?

Gracias!

EDITAR: aquí está mi solución,

TextView emptyView = new TextView(getApplicationContext()); 
emptyView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
emptyView.setTextColor(R.color.black); 
emptyView.setText(R.string.no_purchased_item); 
emptyView.setTextSize(20); 
emptyView.setVisibility(View.GONE); 
emptyView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL); 

((ViewGroup)getListView().getParent()).addView(emptyView); 
getListView().setEmptyView(emptyView); 

alt text

+0

Por qué la propiedad View.GONE ¿ajuste? – medonja

+1

@medonja porque el método setEmptyView (emptyView) no funciona correctamente si no agrega el emptyView a la jerarquía de vista primero, pero al hacerlo, emptyView estará siempre visible. Así que tienes que hacerlo desaparecer y esto funciona bien, ya que lo que hace setEmptyView() es simplemente cambiar la visibilidad de EmptyView según el estado vacío de la lista. – tomalf2

Respuesta

36
public void setEmptyView (View emptyView) 

Since: API Level 1 
Sets the view to show if the adapter is empty 

Llamado en su instancia ListView.

E.g. mListView.setEmptyView (someView);

Puede construir vistas sobre la marcha, o inflar una desde el xml.

1

Hay otro enfoque BaseAdapter tiene el método isEnabled(). Necesita crear su propio adaptador que devolverá ciertos elementos isEnabled (int position) como falso. En este caso, esos elementos serán no seleccionables. Es fácil modificarlo de una manera que cuando la lista está vacía solo agrega un elemento deshabilitado.

Pero seguro método descrito anteriormente por Alex Orlov es mejor

16

A menos que leí mal su pregunta, también puede simplemente especificar cualquier elemento de la vista con un ID de "@android: id/vacío" en su diseño y será cuidado automáticamente por usted. Por ejemplo:

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

<LinearLayout android:id="@android:id/empty" 
    android:layout_width="fill_parent" android:layout_height="fill_parent" 
    android:gravity="center"> 

    <TextView android:text="@string/no_messages" 
     android:layout_width="wrap_content" android:layout_height="wrap_content" 
     style="@style/textBoldLight"> 
    </TextView> 

</LinearLayout> 
+0

No pensé en dar ID de vacío a disposición lineal para centrar "sin elementos encontrados" buen pensamiento. –

+6

Esto solo funcionará para 'ListActivity'. Tendrá que usar el enfoque de Alex para otras clases de 'Actividad'. –

0

Si está utilizando Activity en lugar de ListActivity y desea establecer la gravedad del vacío al centro (tanto horizontal como verticalmente), se debe utilizar esta:

En su diseño:

<?xml version="1.0" encoding="utf-8"?> 
<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/contacts" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

    <LinearLayout 
     android:id="@android:id/empty" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/no_contacts_add_one"> 
     </TextView> 

    </LinearLayout> 


</LinearLayout> 

En su actividad:

ListView contacts = (ListView) view.findViewById(R.id.contacts); 
contacts.setEmptyView(view.findViewById(android.R.id.empty)); 
Cuestiones relacionadas