Wyświetlanie pustego widoku, gdy ListView jest pusty

135

Z jakiegoś powodu pusty widok, w tym przypadku TextView , zawsze pojawia się, nawet jeśli ListView nie jest pusty. Pomyślałem, że ListView automatycznie wykryje, kiedy wyświetlić pusty widok.

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

Jak prawidłowo podłączyć pusty widok?

Sheehan Alam
źródło

Odpowiedzi:

135

Powinno wyglądać tak:

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

Zwróć uwagę na atrybut id .

Nathan Schwermann
źródło
75
musisz używać ListViewActivity, aby działało w ten sposób.
Nathan Schwermann
2
Och, widzę, że mój ListView znajduje się w rzeczywistości w ViewFlipper. Czy jest inny sposób na przedstawienie widoku, gdy lista jest pusta?
Sheehan Alam
11
sam zaimplementowałeś logikę, spójrz na kod źródłowy dla ListViewActivity, aby zobaczyć, jak to robią, lub kiedy wykonasz zapytanie, sprawdź, czy jest puste, jeśli tak, ustaw widok tekstu na VISIBLE, w przeciwnym razie ustaw go na GONE
Nathan Schwermann
4
używanie widoku tekstowego podczas korzystania z niestandardowej karty nie działa.
user590849
3
@schwiz false! nie potrzebujesz ListViewActivity, aby użyć pustej funkcji.
Buffalo,
187

Kiedy przedłużyć FragmentActivityalbo Activityi nie ListActivity , będziemy chcieli przyjrzeć:

ListView.setEmptyView ()

appsthatmatter
źródło
masz jakiś pomysł, jak to zrobić w wynalazcy aplikacji?
JinSnow
118

Jak mówi appsthatmatter, w układzie coś takiego:

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

aw połączonym działaniu:

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

Działa również z GridView ...

Wir
źródło
4
Po co najmniej godzinie próbowania różnych rzeczy i nic nie działa (pokazywanie „pustego” tekstu oprócz danych w widoku listy), zadziałało to w przypadku korzystania z ListView w działaniu zamiast rozszerzania ListActivity. Dziękuję Eddy!
Evan R.
Czy powinienem ukryć TextView, czy coś?
Harsha MV
11
@Harsha android: visibility = "gone"
scragar
42

Wypróbowałem wszystkie powyższe rozwiązania, wymyśliłem rozwiązanie problemu, tutaj zamieszczam pełne rozwiązanie.

Plik 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” ) jest symbolem zastępczym pustego widoku listy.

Oto kod strony java:

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

Pamiętaj, aby umieścić emptyView po powiązaniu adaptera z listview.Mine nie działało po raz pierwszy i po przeniesieniu setEmptyView po setAdapter już działa.

Wynik:

wprowadź opis obrazu tutaj

kgandroid
źródło
1
ten pracował dla mnie po dodaniu android:layout_below="@+id/lv_msglist"do emptyElement
Behnam Heydari
16

Gorąco polecam korzystanie z ViewStubs w ten sposób

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

Zobacz pełny przykład autorstwa Cyrila Mottiera

LOG_TAG
źródło
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));

Działa to wyraźnie z FragmentActivity, jeśli używasz biblioteki obsługi. Przetestowano to, budując dla API 17, czyli obraz 4.2.2.

Yaojin
źródło
7

Kod działania, jego rozszerzenie jest ważne 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, id w obu widokach są ważne.

<?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
źródło
7

Aby dodać, że tak naprawdę nie musisz tworzyć nowych identyfikatorów, zadziała coś takiego jak poniżej.

W układzie:

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

Następnie w ćwiczeniu:

    ListView listView = (ListView) findViewById(android.R.id.list);
    listView.setEmptyView(findViewById(android.R.id.empty));
Luís Ramalho
źródło
4

Miałem ten problem. Musiałem sprawić, by moja klasa rozszerzała ListActivity zamiast Activity i zmienić nazwę mojej listy w XML naandroid:id="@android:id/list"

Matt
źródło
2

Rozwiązaniem programowym będzie:

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
źródło
-3

Najpierw sprawdź, czy lista zawiera wartości:

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

Jeśli tak, w przeciwnym razie użyj:

else {
     listview.setVisibility(View.VISIBLE);
}
Avnish Kumar
źródło
czy chciałbyś dokładniej wyjaśnić, co to jest list?
Roy Lee,
To ArrayList <xyz>
Avnish Kumar
Object [] response = Utility.parseStationresponce (obiekt); int statusCode = (Integer) response [0]; @SuppressWarnings ("unchecked") ArrayList <Stations> list = (ArrayList <Stations>) response [2];
Avnish Kumar
Cóż, sugeruję, abyś umieścił to w swojej odpowiedzi, a nie w komentarzach. Jest to ważne, aby inni zrozumieli konkretny kontekst tego, co piszesz. Ponadto najlepiej będzie, jeśli możesz odnieść swoją odpowiedź do pytania OP. Wreszcie, witamy w SO.
Roy Lee,