แสดงมุมมองที่ว่างเปล่าเมื่อ ListView ว่างเปล่า


137

ด้วยเหตุผลบางประการมุมมองที่ว่างเปล่าTextViewในกรณีนี้จะปรากฏขึ้นเสมอแม้ว่าListViewจะไม่ว่างเปล่าก็ตาม ฉันคิดว่าListViewจะตรวจจับโดยอัตโนมัติว่าเมื่อใดที่จะแสดงมุมมองที่ว่างเปล่า

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

ฉันจะเชื่อมต่อมุมมองที่ว่างเปล่าอย่างเหมาะสมได้อย่างไร?

คำตอบ:


135

ควรเป็นดังนี้:

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

หมายเหตุแอตทริบิวต์id


75
คุณต้องใช้ ListViewActivity เพื่อให้ทำงานในลักษณะนี้
Nathan Schwermann

2
โอ้ฉันเห็นแล้ว ListView ของฉันอยู่ใน ViewFlipper จริงๆ มีวิธีอื่นที่ฉันสามารถนำเสนอมุมมองเมื่อรายการว่างเปล่าได้หรือไม่?
Sheehan Alam

11
คุณใช้ตรรกะด้วยตัวเองดูที่ซอร์สโค้ดสำหรับ ListViewActivity เพื่อดูว่ามันทำอย่างไรหรือเมื่อคุณทำการตรวจสอบเพื่อดูว่าว่างหรือไม่หากตั้งค่ามุมมองข้อความของคุณเป็น VISIBLE หรือตั้งค่าเป็น GONE
Nathan Schwermann

4
การใช้ textview เมื่อคุณใช้อะแดปเตอร์แบบกำหนดเองไม่ทำงาน
user590849

3
@schwiz เท็จ! คุณไม่จำเป็นต้องมี ListViewActivity เพื่อใช้ฟังก์ชันที่ว่างเปล่า
ควาย


118

ดังที่ appsthatmatter กล่าวว่าในเค้าโครงมีลักษณะดังนี้:

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

และในกิจกรรมที่เชื่อมโยง:

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

ยังทำงานร่วมกับ GridView ...


4
หลังจากลองทำสิ่งต่างๆอย่างน้อยหนึ่งชั่วโมงและไม่มีอะไรได้ผล (แสดงข้อความ "ว่าง" นอกเหนือจากข้อมูลในมุมมองรายการ) สิ่งนี้ใช้ได้ผลสำหรับฉันเมื่อใช้ ListView ในกิจกรรมแทนที่จะขยาย ListActivity ขอบคุณ Eddy!
Evan R.

ฉันควรซ่อน TextView หรืออะไร?
Harsha MV

11
@Harsha android: visibility = "gone"
scragar

43

ฉันลองวิธีแก้ปัญหาข้างต้นทั้งหมดแล้วฉันมาแก้ปัญหาที่นี่ฉันกำลังโพสต์วิธีแก้ปัญหาทั้งหมด

ไฟล์ 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" ) เป็นตัวยึดสำหรับมุมมองรายการที่ว่างเปล่า

นี่คือรหัสสำหรับหน้า java:

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

อย่าลืมวาง emptyView หลังจากผูกอะแดปเตอร์กับ listview ฉันไม่ทำงานเป็นครั้งแรกและหลังจากที่ฉันย้าย setEmptyView หลังจาก setAdapter ตอนนี้ก็ใช้งานได้แล้ว

เอาท์พุต:

ป้อนคำอธิบายภาพที่นี่


1
นี้ทำงานให้ฉันหลังจากที่เพิ่มandroid:layout_below="@+id/lv_msglist"สำหรับemptyElement
Behnam Heydari

16

ขอแนะนำให้คุณใช้ ViewStubs แบบนี้

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

ดูตัวอย่างเต็มจาก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));

สิ่งนี้ใช้ได้อย่างชัดเจนกับ FragmentActivity หากคุณกำลังใช้ไลบรารีสนับสนุน ทดสอบสิ่งนี้โดยสร้างสำหรับ API 17 เช่น 4.2.2 อิมเมจ


7

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

xml เค้าโครงรหัสในทั้งสองมุมมองมีความสำคัญ

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

เพียงเพื่อเพิ่มว่าคุณไม่จำเป็นต้องสร้าง ID ใหม่สิ่งต่อไปนี้จะได้ผล

ในเค้าโครง:

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

จากนั้นในกิจกรรม:

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

4

ฉันมีปัญหานี้ ฉันต้องทำให้ชั้นเรียนของฉันขยาย ListActivity แทนที่จะเป็นกิจกรรมและเปลี่ยนชื่อรายการของฉันใน XML เป็นandroid:id="@android:id/list"


2

โซลูชันทางโปรแกรมจะเป็น:

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

ก่อนอื่นให้ตรวจสอบว่ารายการมีค่าบางอย่าง:

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

หากเป็นเช่นนั้นก็ตกลงให้ใช้:

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

คุณสนใจที่จะอธิบายเพิ่มเติมว่าอะไรคือlistอะไร?
Roy Lee

มันคือ ArrayList <xyz>
Avnish Kumar

Object [] response = Utility.parseStationresponce (object); int statusCode = (จำนวนเต็ม) การตอบสนอง [0]; @SuppressWarnings ("unchecked") ArrayList <Stations> list = (ArrayList <Stations>) response [2];
Avnish Kumar

ดีฉันขอแนะนำให้คุณใส่เป็นส่วนหนึ่งของคำตอบของคุณมากกว่าความคิดเห็น นี่เป็นสิ่งสำคัญที่จะทำให้ผู้อื่นเข้าใจบริบทเฉพาะของสิ่งที่คุณกำลังเขียน นอกจากนี้ยังเป็นการดีที่สุดหากคุณสามารถเชื่อมโยงคำตอบของคุณกับคำถามของ OP ได้ ในที่สุดยินดีต้อนรับสู่ SO
Roy Lee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.