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?

Sheehan Alam
quelle

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.

Nathan Schwermann
quelle
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
187

Wenn Sie erweitern FragmentActivityoder Activityund nicht ListActivity , werden Sie einen Blick nehmen wollen:

ListView.setEmptyView ()

appsthatmatter
quelle
Irgendeine Idee, wie man das in App Inventor macht?
JinSnow
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 ...

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

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

LOG_TAG
quelle
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.

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

Matt
quelle
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);
Mika
quelle
-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);
}
Avnish Kumar
quelle
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