Mostra vista vuota quando ListView è vuoto


135

Per qualche motivo la vista vuota, in questo caso un TextView , appare sempre anche quando ListView non è vuoto. Pensavo che ListView rileverà automaticamente quando mostrare la vista vuota.

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

Come posso collegare correttamente la vista vuota?

Risposte:


135

Dovrebbe essere così:

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

Nota l' attributo id .


75
devi usare ListViewActivity perché funzioni in questo modo.
Nathan Schwermann,

2
oh vedo, il mio ListView è in realtà all'interno di un ViewFlipper. C'è un altro modo in cui posso presentare la vista quando l'elenco è vuoto?
Sheehan Alam,

11
hai implementato tu stesso la logica, dai un'occhiata al codice sorgente per ListViewActivity per vedere come lo fanno, o quando fai la tua query controlla per vedere se è vuota, in tal caso imposta la visualizzazione del testo su VISIBILE, altrimenti imposta su GONE
Nathan Schwermann,

4
l'utilizzo della visualizzazione di testo quando si utilizza un adattatore personalizzato non funziona.
user590849

3
@schwiz false! non è necessario un ListViewActivity per utilizzare la funzionalità vuota.
Buffalo,


118

Come dice appsthatmatter, nel layout qualcosa di simile:

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

e nell'attività collegata:

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

Funziona anche con un GridView ...


4
Dopo almeno un'ora di tentativi vari e senza aver funzionato (mostrando il testo "vuoto" in aggiunta ai dati nella visualizzazione elenco), questo ha funzionato per me quando utilizzo un ListView in un'attività invece di estendere ListActivity. Grazie Eddy!
Evan R.,

Devo rendere nascosto TextView o qualcosa del genere?
Harsha MV,

11
@Harsha android: visible = "gone"
scragar il

42

Ho provato tutte le soluzioni di cui sopra, ho risolto il problema e ho pubblicato la soluzione completa.

Il file 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" ) è il segnaposto per la visualizzazione elenco vuota.

Ecco il codice per la pagina Java:

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

Ricorda di posizionare emptyView dopo aver associato l'adattatore a listview.Il mio non funzionava per la prima volta e dopo aver spostato setEmptyView dopo setAdapter ora funziona.

Produzione:

inserisci qui la descrizione dell'immagine


1
questo ha funzionato per me dopo aver aggiunto android:layout_below="@+id/lv_msglist"per emptyElement
Behnam Heydari il

16

Consiglio vivamente di usare ViewStubs in questo modo

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

Guarda l'esempio completo di 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));

Funziona chiaramente con FragmentActivity se stai usando la libreria di supporto. Testato costruendo per API 17 cioè 4.2.2 immagine.


7

Codice attività, è importante estenderlo 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, l'id in entrambe le viste è importante.

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

Solo per aggiungere che non è necessario creare nuovi ID, qualcosa di simile al seguente funzionerà.

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

Quindi nell'attività:

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

4

Ho avuto questo problema Ho dovuto fare in modo che la mia classe estendesse ListActivity anziché Activity e rinominassi la mia lista nell'XML inandroid:id="@android:id/list"


2

Una soluzione a livello di programmazione sarà:

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

Innanzitutto controlla che l'elenco contenga alcuni valori:

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

Se è quindi OK, altrimenti utilizzare:

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

ti andrebbe di elaborare ulteriormente cos'è un list?
Roy Lee,

It's an ArrayList <xyz>
Avnish Kumar il

Object [] response = Utility.parseStationresponce (oggetto); int statusCode = (Integer) response [0]; @SuppressWarnings ("unchecked") ArrayList <Stations> list = (ArrayList <Stations>) response [2];
Avnish Kumar,

Bene bene, ti suggerisco di inserirlo come parte della tua risposta rispetto ai commenti. Questo è importante per indurre gli altri a comprendere il contesto specifico di ciò che stai scrivendo. Inoltre, è anche meglio se puoi mettere in relazione la tua risposta alla domanda di OP. Infine, benvenuto in SO.
Roy Lee,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.