Leere Ansicht anzeigen, wenn ListView leer ist


135

Aus irgendeinem Grund wird die leere Ansicht, in diesem Fall eine Textansicht , immer angezeigt, auch wenn die ListView nicht leer ist. Ich dachte, die ListView würde automatisch erkennen, wann die leere Ansicht angezeigt werden soll .

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

Wie kann ich die leere Ansicht richtig anschließen?

Antworten:


135

Es sollte so sein:

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

Beachten Sie das ID- Attribut.


75
Sie müssen eine ListViewActivity verwenden, damit dies funktioniert.
Nathan Schwermann

2
Oh, ich verstehe, meine ListView befindet sich tatsächlich in einem ViewFlipper. Gibt es eine andere Möglichkeit, die Ansicht zu präsentieren, wenn die Liste leer ist?
Sheehan Alam

11
Sie haben die Logik selbst implementiert, sehen sich den Quellcode für ListViewActivity an, um zu sehen, wie sie funktionieren, oder wenn Sie Ihre Abfrage überprüfen, ob sie leer ist, setzen Sie Ihre Textansicht auf VISIBLE, andernfalls auf GONE
Nathan Schwermann

4
Die Verwendung der Textansicht bei Verwendung eines benutzerdefinierten Adapters funktioniert nicht.
user590849

3
@schwiz falsch! Sie benötigen keine ListViewActivity, um die leere Funktionalität zu verwenden.
Buffalo


118

Wie appsthatmatter sagt, im Layout so etwas wie:

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

und in der verknüpften Aktivität:

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

Funktioniert auch mit einem GridView ...


4
Nachdem ich mindestens eine Stunde lang verschiedene Dinge ausprobiert hatte und nichts funktionierte (der "leere" Text wurde zusätzlich zu den Daten in der Listenansicht angezeigt), funktionierte dies für mich, wenn ich eine ListView in einer Aktivität verwendete, anstatt ListActivity zu erweitern. Danke Eddy!
Evan R.

Soll ich die Textansicht ausblenden oder so?
Harsha MV

11
@ Harsha Android: Sichtbarkeit = "weg"
Scragar

42

Ich habe alle oben genannten Lösungen ausprobiert. Ich habe das Problem gelöst. Hier veröffentliche ich die vollständige Lösung.

Die XML-Datei :

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

Die Textansicht ( "@ + id / emptyElement" ) ist der Platzhalter für die leere Listenansicht.

Hier ist der Code für die Java-Seite:

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

Denken Sie daran, die leere Ansicht zu platzieren, nachdem Sie den Adapter an listview gebunden haben. Mine funktionierte zum ersten Mal nicht und nachdem ich die setEmptyView nach der setAdapter verschoben habe, funktioniert sie jetzt.

Ausgabe:

Geben Sie hier die Bildbeschreibung ein


1
Dies funktionierte für mich nach dem Hinzufügen android:layout_below="@+id/lv_msglist"für emptyElement
Behnam Heydari

16

Ich empfehle Ihnen dringend, ViewStubs wie diesen zu verwenden

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

Siehe das vollständige Beispiel von 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));

Dies funktioniert eindeutig mit FragmentActivity, wenn Sie die Support-Bibliothek verwenden. Getestet durch Erstellen für API 17, dh 4.2.2 Image.


7

Aktivitätscode, es ist wichtig zu erweitern 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, die ID in beiden Ansichten sind wichtig.

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

Nur um hinzuzufügen, dass Sie nicht wirklich neue IDs erstellen müssen, funktioniert so etwas wie das Folgende.

Im Layout:

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

Dann in der Aktivität:

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

4

Ich hatte dieses Problem. Ich musste meine Klasse dazu bringen, ListActivity anstelle von Activity zu erweitern, und meine Liste in XML umbenennen inandroid:id="@android:id/list"


2

Eine programmatische Lösung wird sein:

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

Überprüfen Sie zunächst, ob die Liste einige Werte enthält:

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

Wenn es dann OK ist, verwenden Sie andernfalls:

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

Möchten Sie näher darauf eingehen, was ein ist list?
Roy Lee

Es ist eine ArrayList <xyz>
Avnish Kumar

Object [] response = Utility.parseStationresponce (Objekt); int statusCode = (Integer) Antwort [0]; @SuppressWarnings ("nicht markiert") ArrayList <Stations> list = (ArrayList <Stations>) Antwort [2];
Avnish Kumar

Gut, ich schlage vor, dass Sie dies als Teil Ihrer Antwort als Kommentare angeben. Dies ist wichtig, damit andere den spezifischen Kontext Ihres Schreibens verstehen. Darüber hinaus ist es am besten, wenn Sie Ihre Antwort auf die Frage von OP beziehen können. Zum Schluss Willkommen bei SO.
Roy Lee
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.