Affichage d'une vue vide lorsque ListView est vide


135

Pour une raison quelconque, la vue vide, un TextView dans ce cas, apparaît toujours même lorsque ListView n'est pas vide. Je pensais que ListView détecterait automatiquement quand afficher la vue vide.

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

Comment puis-je connecter correctement la vue vide?

Réponses:


135

Ça devrait être comme ça:

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

Notez l' attribut id .


75
vous devez utiliser un ListViewActivity pour que cela fonctionne de cette façon.
Nathan Schwermann

2
oh je vois, ma ListView est en fait à l'intérieur d'un ViewFlipper. Existe-t-il une autre façon de présenter la vue lorsque la liste est vide?
Sheehan Alam

11
vous avez implémenté la logique vous-même, jetez un œil au code source de ListViewActivity pour voir comment ils le font, ou lorsque vous vérifiez votre requête pour voir si elle est vide, si c'est le cas, définissez votre vue texte sur VISIBLE, sinon définissez-la sur GONE
Nathan Schwermann

4
l'utilisation de la vue de texte lorsque vous utilisez un adaptateur personnalisé ne fonctionne pas.
user590849

3
@schwiz faux! vous n'avez pas besoin d'un ListViewActivity pour utiliser la fonctionnalité vide.
Buffalo


118

Comme le dit appsthatmatter, dans la mise en page quelque chose comme:

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

et dans l'activité liée:

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

Fonctionne également avec un GridView ...


4
Après au moins une heure à essayer diverses choses et sans que rien ne fonctionne (montrant le texte «vide» en plus des données dans la liste), cela a fonctionné pour moi lorsque j'utilisais un ListView dans une activité au lieu d'étendre ListActivity. Merci Eddy!
Evan R.

Dois-je masquer TextView ou quelque chose?
Harsha MV du

11
@Harsha android: visibilité = "part"
scragar

42

J'ai essayé toutes les solutions ci-dessus, j'ai résolu le problème, je publie ici la solution complète.

Le fichier 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>

Le textView ( "@ + id / emptyElement" ) est l'espace réservé pour la liste vide.

Voici le code de la page java:

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

N'oubliez pas de placer le emptyView après avoir lié l'adaptateur à listview.Mine ne fonctionnait pas pour la première fois et après avoir déplacé le setEmptyView après le setAdapter, il fonctionne maintenant.

Production:

entrez la description de l'image ici


1
cela a fonctionné pour moi après avoir ajouté android:layout_below="@+id/lv_msglist"pour emptyElement
Behnam Heydari

16

Je vous recommande fortement d'utiliser ViewStubs comme celui-ci

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

Voir l'exemple complet de Cyril Mottier


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));

Cela fonctionne clairement avec FragmentActivity si vous utilisez la bibliothèque de support. Testé ceci en construisant pour l'image API 17 ie 4.2.2.


7

Code d'activité, il est important d'étendre 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));
    }
}

Mise en page xml, l'identifiant dans les deux vues est important.

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

7

Juste pour ajouter que vous n'avez pas vraiment besoin de créer de nouveaux identifiants, quelque chose comme ce qui suit fonctionnera.

Dans la mise en page:

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

Puis dans l'activité:

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

4

J'ai eu ce problème. J'ai dû faire en sorte que ma classe étende ListActivity plutôt que Activity, et renommer ma liste dans le XML enandroid:id="@android:id/list"


2

Une solution par programme sera:

TextView textView = new TextView(context);
textView.setId(android.R.id.empty);
textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
textView.setText("No result found");
listView.setEmptyView(textView);

-3

Vérifiez d'abord que la liste contient quelques valeurs:

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

Si c'est OK, sinon utilisez:

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

voudriez-vous préciser davantage ce qu'est un list?
Roy Lee

C'est une ArrayList <xyz>
Avnish Kumar

Object [] response = Utility.parseStationresponce (objet); int statusCode = (Entier) réponse [0]; @SuppressWarnings ("non coché") ArrayList <Stations> list = (ArrayList <Stations>) réponse [2];
Avnish Kumar

Eh bien, je vous suggère de mettre cela dans votre réponse plutôt que dans vos commentaires. Ceci est important pour amener les autres à comprendre le contexte spécifique de ce que vous écrivez. En outre, il est également préférable que vous puissiez relier votre réponse à la question d'OP. Enfin, bienvenue à SO.
Roy Lee
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.