Menampilkan tampilan kosong saat ListView kosong


137

Untuk beberapa alasan, tampilan kosong, dalam hal ini TextView , selalu muncul bahkan saat ListView tidak kosong. Saya pikir ListView akan secara otomatis mendeteksi kapan harus menampilkan tampilan kosong.

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

Bagaimana cara menghubungkan tampilan kosong dengan benar?

Jawaban:


135

Seharusnya seperti ini:

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

Perhatikan atribut id .


75
Anda harus menggunakan ListViewActivity agar bisa bekerja dengan cara ini.
Nathan Schwermann

2
oh begitu, ListView saya sebenarnya ada di dalam ViewFlipper. Apakah ada cara lain untuk menampilkan tampilan saat daftar kosong?
Sheehan Alam

11
Anda telah mengimplementasikan logikanya sendiri, lihat kode sumber untuk ListViewActivity untuk melihat bagaimana mereka melakukannya, atau saat Anda membuat kueri untuk memeriksa apakah kosong, jika demikian setel tampilan teks Anda ke TERLIHAT, jika tidak setel ke GONE
Nathan Schwermann

4
menggunakan textview saat Anda menggunakan adaptor kustom tidak berfungsi.
pengguna590849

3
@wiz palsu! Anda tidak memerlukan ListViewActivity untuk menggunakan fungsionalitas kosong.
Buffalo


118

Seperti yang dikatakan appsthatmatter, dalam tata letak seperti ini:

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

dan di Aktivitas tertaut:

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

Apakah juga bekerja dengan GridView ...


4
Setelah setidaknya satu jam mencoba berbagai hal, dan tidak ada yang berfungsi (menampilkan teks "kosong" selain data di listview), ini berfungsi untuk saya saat menggunakan ListView dalam Aktivitas alih-alih memperluas ListActivity. Terima kasih Eddy!
Evan R.

Haruskah saya membuat TextView disembunyikan atau sesuatu?
Harsha MV

11
@Harsha android: visibility = "hilang"
scragar

43

Saya mencoba semua solusi di atas, saya menemukan pemecahan masalah, di sini saya memposting solusi lengkap.

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" ) adalah placeholder untuk tampilan daftar kosong.

Berikut adalah kode untuk halaman java:

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

Ingatlah untuk menempatkan emptyView setelah mengikat adaptor ke listview.Mine tidak berfungsi untuk pertama kalinya dan setelah saya memindahkan setEmptyView setelah setAdapter, sekarang berfungsi.

Keluaran:

masukkan deskripsi gambar di sini


1
ini berhasil untuk saya setelah menambahkan android:layout_below="@+id/lv_msglist"untuk emptyElement
Behnam Heydari

16

Saya sangat menyarankan Anda untuk menggunakan ViewStubs seperti ini

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

Lihat contoh lengkap dari 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));

Ini bekerja dengan jelas dengan FragmentActivity jika Anda menggunakan pustaka dukungan. Menguji ini dengan membangun untuk API 17 yaitu gambar 4.2.2.


7

Kode aktivitas, penting untuk diperluas 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 di kedua tampilan itu penting.

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

Hanya untuk menambahkan bahwa Anda tidak benar-benar perlu membuat ID baru, sesuatu seperti berikut ini akan berfungsi.

Dalam tata letak:

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

Kemudian dalam aktivitas:

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

4

Saya punya masalah ini. Saya harus membuat kelas saya memperluas ListActivity daripada Activity, dan mengganti nama daftar saya di XML menjadiandroid:id="@android:id/list"


2

Solusi secara terprogram adalah:

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

Pertama periksa daftar berisi beberapa nilai:

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

Jika sudah OK, jika tidak gunakan:

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

maukah Anda menjelaskan lebih lanjut apa itu list?
Roy Lee

Ini adalah ArrayList <xyz>
Avnish Kumar

Object [] response = Utility.parseStationresponce (object); int statusCode = (Bilangan bulat) tanggapan [0]; @SuppressWarnings ("tidak dicentang") ArrayList <Stations> list = (ArrayList <Stations>) respons [2];
Avnish Kumar

Baiklah, saya sarankan Anda meletakkan itu sebagai bagian dari jawaban Anda daripada komentar. Ini penting agar orang lain memahami konteks spesifik dari apa yang Anda tulis. Selain itu, sebaiknya Anda juga menghubungkan jawaban Anda dengan pertanyaan OP. Akhirnya, Selamat Datang di SO.
Roy Lee
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.