Hiển thị chế độ xem trống khi ListView trống


135

Vì một số lý do, chế độ xem trống, TextView trong trường hợp này, luôn xuất hiện ngay cả khi ListView không trống. Tôi nghĩ rằng ListView sẽ tự động phát hiện khi hiển thị chế độ xem trống.

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

Làm thế nào tôi có thể treo lên xem trống đúng cách?

Câu trả lời:


135

Nó nên như thế này:

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

Lưu ý thuộc tính id .


75
bạn phải sử dụng ListViewActivity để nó hoạt động theo cách này.
Nathan Schwermann

2
oh tôi hiểu rồi, ListView của tôi thực sự nằm trong ViewFlipper. Có cách nào khác để tôi có thể trình bày chế độ xem khi danh sách trống không?
Sheehan Alam

11
bạn đã tự mình thực hiện logic, hãy xem mã nguồn cho ListViewActivity để xem cách họ thực hiện hoặc khi bạn thực hiện kiểm tra truy vấn của mình để xem nó có trống không, nếu vậy hãy đặt chế độ xem văn bản của bạn thành VISIBLE, nếu không, hãy đặt nó thành Gone
Nathan Schwermann

4
sử dụng textview khi bạn đang sử dụng bộ điều hợp tùy chỉnh không hoạt động.
dùng590849

3
@schwiz sai! bạn không cần ListViewActivity để sử dụng chức năng trống.
Trâu

187

Khi bạn mở rộng FragmentActivityhoặc Activitykhông ListActivity , bạn sẽ muốn có một cái nhìn tại địa chỉ:

ListView.setEmptyView ()


Bất kỳ ý tưởng làm thế nào để làm điều đó trong nhà phát minh ứng dụng?
JinSnow

118

Như appsthatmatter nói, trong cách bố trí như:

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

và trong Hoạt động được liên kết:

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

Cũng hoạt động với GridView ...


4
Sau ít nhất một giờ thử nhiều thứ khác nhau và không có gì hoạt động (hiển thị văn bản "trống" ngoài dữ liệu trong listview), điều này hiệu quả với tôi khi sử dụng ListView trong Activity thay vì mở rộng ListActivity. Cảm ơn bạn Eddy!
Evan R.

Tôi có nên ẩn TextView hay cái gì đó không?
MV Harsha

11
@Harsha android: mức độ hiển thị = "biến mất"
scragar

42

Tôi đã thử tất cả các giải pháp trên. Tôi đã đưa ra cách giải quyết vấn đề. Tôi đang đăng giải pháp đầy đủ.

Tệp 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 / blankEuity" ) là trình giữ chỗ cho listview trống.

Đây là mã cho trang java:

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

Hãy nhớ đặt voidView sau khi ràng buộc bộ điều hợp với listview.Mine không hoạt động lần đầu tiên và sau khi tôi di chuyển setEmptyView sau setAd CHƯƠNG thì nó hiện đang hoạt động.

Đầu ra:

nhập mô tả hình ảnh ở đây


1
này làm việc cho tôi sau khi thêm android:layout_below="@+id/lv_msglist"cho emptyElement
Behnam Heydari

16

Tôi thực sự khuyên bạn nên sử dụng ViewStub như thế này

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

Xem ví dụ đầy đủ từ 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));

Điều này hoạt động rõ ràng với FragmentActivity nếu bạn đang sử dụng thư viện hỗ trợ. Đã kiểm tra điều này bằng cách xây dựng cho API 17 tức là hình ảnh 4.2.2.


7

Mã hoạt động, nó quan trọng để mở rộng 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));
    }
}

Bố cục xml, id trong cả hai khung nhìn đều quan trọng.

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

Chỉ cần thêm rằng bạn không thực sự cần tạo ID mới, một cái gì đó như sau sẽ hoạt động.

Trong cách bố trí:

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

Sau đó trong hoạt động:

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

4

Tôi đã có vấn đề này. Tôi đã phải làm cho lớp của mình mở rộng ListActivity chứ không phải Activity và đổi tên danh sách của tôi trong XML thànhandroid:id="@android:id/list"


2

Một giải pháp lập trình sẽ là:

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

Trước tiên hãy kiểm tra danh sách chứa một số giá trị:

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

Nếu đúng thì OK, nếu không thì sử dụng:

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

bạn có quan tâm để xây dựng thêm những gì là một list?
Roy Lee

Đó là một ArrayList <xyz>
Avarn Kumar

Đối tượng [] hồi đáp = Utility.parseStationresponce (đối tượng); int statusCode = (Integer) hồi đáp [0]; @SuppressWarnings ("không được kiểm tra") ArrayList <Ga> list = (ArrayList <Station>) answer [2];
Avarn Kumar

Tốt, tôi đề nghị bạn đặt nó như là một phần của câu trả lời của bạn hơn bình luận. Điều này rất quan trọng để khiến người khác hiểu được bối cảnh cụ thể của những gì bạn đang viết. Hơn nữa, cũng tốt nhất nếu bạn có thể liên hệ câu trả lời của mình với câu hỏi của OP. Cuối cùng, Chào mừng bạn đến với SO.
Roy Lee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.