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?

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 .


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,


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


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


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


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.


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>

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

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"


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

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

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.