51 votes

Afficher le message "Aucun élément" dans ListView

J'ai créé des interfaces utilisateur composites dans mes applications Android et certains contrôles ListView (parmi d'autres contrôles) sont intégrés à une vue. Pour cette raison, j'ai utilisé "Activité" comme classe de base d'activité.

Maintenant, je dois afficher un message simple du type "Aucun élément" lorsque le contrôle ListView lié à mon adaptateur est vide. Je sais que cela est possible avec ListActivity, mais je ne suis pas sûr de la meilleure approche pour cela.

99voto

Joseph Earl Points 11953

Vous pouvez avoir une vue vide sans ListActivity! La bonne méthode est comme suit

D'abord ajouter un 'vide' affichage de votre mise en page XML ci-dessous votre liste

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

<TextView
    android:id="@+id/empty"
    android:text="Empty"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    />
...

Prochaine remplacer l' onContentChanged méthode de votre activité et définir le vide de la vue de votre liste à votre vue vide:

@Override
public void onContentChanged() {
    super.onContentChanged();

    View empty = findViewById(R.id.empty);
    ListView list = (ListView) findViewById(R.id.list);
    list.setEmptyView(empty);
}

Ça y est! Android va prendre soin de masquer/afficher la liste et affichage vide lorsque vous mettez à jour la carte.

La Magie

De décider si la vue vide est affichée ou pas est gérée par la super-classe de ListView, AdapterView. AdapterView enregistre un DataSetObserver sur l'ensemble de l'adaptateur de sorte qu'il est notifiée à chaque fois que les données sont modifiées. Cela déclenche un appel à l' checkFocus en AdapterView qui contient les lignes suivantes

if (mEmptyView != null) {
    updateEmptyStatus((adapter == null) || adapter.isEmpty());
}

et fixe le vide de vue de la visibilité selon que la carte est vide ou pas.

43voto

RoflcoptrException Points 22111

Vous êtes à la recherche pour le vide vue d'une ListActivity:

http://developer.android.com/reference/android/app/ListActivity.html

Si vous utilisez ListView vous pouvez utiliser la méthode setEmptyView():

http://developer.android.com/reference/android/widget/AdapterView.html#setEmptyView(android.view.View)

9voto

GrAnd Points 5387

Il suffit de combiner vos ListView avec TextView :

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
    android:id="@+id/list"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent" />
<TextView
    android:id="@+id/list_empty"
    android:text="No Item"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"/>
</LinearLayout>
 

Ensuite, vérifiez le nombre d'articles et la visibilité des canaux sur ListView conséquence:

     ListView lv = (ListView)findViewById(R.id.list);
    lv.setVisibility((adapter.isEmpty())?View.GONE:View.VISIBLE); 
 

Si vous utilisez un adaptateur personnalisé, vous pouvez le faire dans la méthode notifyDataSetChanged remplacée.

4voto

Venky Points 8716

Vous pouvez utiliser Toast Message pour cela ..

Vérifiez le nombre de valeurs de l'adaptateur par adapter.getCount()

 if(Adapter.getCount()!=0){
      List.setAdapter(Adapter); 
}else{
     Toast.makeText(YourActivityName.this, "No Items Available",Toast.LENGTH_SHORT).show();
}
 

2voto

Fenjin_Wang Points 47

Pour le code de mise en page de Joseph, vous devez éditer les éléments @ + id / list et @ + id / empty en @android: id / * , comme suit:

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

<TextView
    android:id="@android:id/empty"
    android:text="Empty"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    />
 

De cette façon, vous n'avez même pas besoin de remplacer la fonction onContentChanged ().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X