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?

Sheehan Alam
la source

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 .

Nathan Schwermann
la source
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
187

Lorsque vous étendez FragmentActivityou Activityet non ListActivity , vous aurez envie de jeter un oeil à:

ListView.setEmptyView ()

appsthatmatter
la source
une idée comment faire cela dans l'inventeur d'applications?
JinSnow
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 ...

Tourbillon
la source
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

kgandroid
la source
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

LOG_TAG
la source
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.

Yaojin
la source
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>
Mizipzor
la source
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));
Luís Ramalho
la source
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"

Mat
la source
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);
Mika
la source
-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);
}
Avnish Kumar
la source
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