web-dev-qa-db-fra.com

Affichage d'une vue vide lorsque ListView est vide

Pour une raison quelconque, la vue vide, un TextView dans ce cas, apparaît toujours même lorsque le ListView n'est pas vide. Je pensais que le 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 brancher correctement la vue vide?

131
Sheehan Alam

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

131
schwiz

Lorsque vous prolongez FragmentActivity ou Activity et pas ListActivity, vous voudrez jeter un coup d'œil à:

ListView.setEmptyView ()

186
appsthatmatter

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-t-il également avec un GridView ...

117
Eddy

J'ai essayé toutes les solutions ci-dessus.Je suis venu résoudre le problème.Voici, je poste 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>

TextView ("(+ @ id/emptyElement") est l’espace réservé pour la listview vide.

Voici le code pour 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.

Sortie:

enter image description here

40
kgandroid

Je vous recommande fortement d'utiliser ViewStubs comme ceci

<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

16
LOG_TAG
<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. Ceci a été testé en construisant pour l’API 17 c’est-à-dire l’image 4.2.2.

8
Yaojin

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

Layout xml, les identifiants dans les deux vues sont importants.

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

Juste pour ajouter que vous n'avez pas vraiment besoin de créer de nouveaux identifiants, les opérations suivantes fonctionneront.

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));
7
Luís Ramalho

J'ai eu ce problème. Je devais obliger ma classe à étendre ListActivity plutôt que Activity et à renommer ma liste dans XML en Android:id="@Android:id/list"

4
Matt

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