सूची दृश्य खाली होने पर खाली दृश्य दिखा रहा है


135

किसी कारण से खाली दृश्य, इस मामले में एक TextView , हमेशा तब भी प्रकट होता है जब सूची दृश्य रिक्त नहीं होता है। मुझे लगा कि खाली दृश्य दिखाने के लिए 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" />

आईडी विशेषता पर ध्यान दें ।


75
इस तरह से काम करने के लिए आपको एक ListViewActivity का उपयोग करना होगा।
नाथन श्वरमन

2
ओह, मैं देख रहा हूँ, मेरा ListView वास्तव में ViewFlipper के अंदर है। क्या कोई अन्य तरीका है जब मैं सूची खाली होने पर दृश्य प्रस्तुत कर सकता हूं?
शीहान आलम

11
आपने तर्क को स्वयं कार्यान्वित किया है, ListViewActivity के लिए सोर्सकोड पर एक नज़र डालें कि वे इसे कैसे करते हैं, या जब आप खाली हैं, तो यह देखने के लिए अपनी क्वेरी की जांच करें कि क्या ऐसा है, तो अपने पाठ दृश्य को विज़िबल पर सेट करें, अन्यथा इसे सेट करें।
नाथन श्वरमन

4
जब आप एक कस्टम एडेप्टर का उपयोग कर रहे हैं तो टेक्स्टव्यू का उपयोग करना काम नहीं कर रहा है।
user590849

3
@schwiz झूठा! खाली कार्यक्षमता का उपयोग करने के लिए आपको एक ListViewActivity की आवश्यकता नहीं है।
बफेलो

187

जब आप का विस्तार FragmentActivityया Activityऔर नहीं ListActivity , आप पर एक नज़र डालना चाहेंगे:

ListView.setEmptyView ()


किसी भी विचार कैसे app आविष्कारक में ऐसा करने के लिए?
जिंसाव

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
विभिन्न चीजों की कोशिश करने के कम से कम एक घंटे के बाद, और कुछ भी काम नहीं होने पर (सूची में डेटा के अलावा "खाली" पाठ दिखाते हुए), इसने मेरे लिए काम किया जब लिस्ट एक्टिविटी को बढ़ाने के बजाय एक सूची में उपयोग किया। शुक्रिया एडी!
इवान आर।

क्या मुझे टेक्स्ट व्यू को छिपाया जाना चाहिए या कुछ और करना चाहिए?
हर्षा एमवी

11
@ हर्षा एंड्रॉइड: विजिबिलिटी = "गई"
स्क्रैगर

42

मैंने उपरोक्त सभी समाधानों की कोशिश की। मैं इस मुद्दे को हल कर रहा हूं। मैं पूरा समाधान पोस्ट कर रहा हूं।

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 / vacElement" ) खाली सूची के लिए प्लेसहोल्डर है।

यहाँ जावा पेज के लिए कोड है:

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

याद रखें कि लिस्टव्यू के लिए एडेप्टर को बांधने के बाद खाली दृश्य को रखें। मेन पहली बार काम नहीं कर रहा था और जब मैंने सेट एडेप्टर के बाद सेटमेमपोव को स्थानांतरित किया तो यह अब काम कर रहा है।

आउटपुट:

यहां छवि विवरण दर्ज करें


1
यह मेरे लिए काम करने के बाद खाली करने केandroid:layout_below="@+id/lv_msglist" लिए जोड़ दिया
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>

इसका पूरा उदाहरण देखें साइरिल मॉटियर से


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 के साथ काम करता है यदि आप समर्थन पुस्तकालय का उपयोग कर रहे हैं। एपीआई 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

बस यह जोड़ने के लिए कि आपको वास्तव में नई आईडी बनाने की आवश्यकता नहीं है, निम्नलिखित की तरह कुछ काम करेगा।

लेआउट में:

<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?
रॉय ली

यह एक ArrayList है <xyz>
अवनीश कुमार

ऑब्जेक्ट [] प्रतिक्रिया = यूटिलिटी.परसेप्टरप्रोसेस (ऑब्जेक्ट); int statusCode = (पूर्णांक) प्रतिक्रिया [0]; @SuppressWarnings ("अनियंत्रित") ArrayList <स्टेशनों> सूची = (ArrayList <स्टेशनों>) प्रतिक्रिया [2];
अवनीश कुमार

अच्छा है, मैं आपको सुझाव देता हूं कि टिप्पणियों के बजाय आपके उत्तर के हिस्से के रूप में। आप जो लिख रहे हैं, उसके विशिष्ट संदर्भ को समझने के लिए दूसरों को प्राप्त करना महत्वपूर्ण है। इसके अलावा, यह भी सबसे अच्छा है अगर आप ओपी के सवाल के जवाब से संबंधित कर सकते हैं। अंत में, एसओ में आपका स्वागत है।
रॉय ली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.