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?

Sheehan Alam
sumber

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 .

Nathan Schwermann
sumber
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
188

Saat Anda memperpanjang FragmentActivityatau Activitydan tidak ListActivity , Anda pasti ingin melihat:

ListView.setEmptyView ()

appsthatmatter
sumber
tahu bagaimana melakukannya di penemu aplikasi?
JinSnow
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 ...

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

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

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

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

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