ListView boş olduğunda boş görünüm gösteriliyor


135

Nedense boş görünüm, bu durumda bir TextView , ListView boş olmasa bile her zaman görünür . ListView otomatik olarak ne zaman boş görünümü göstermek için algılayacağını düşündüm .

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

Boş görünümü nasıl düzgün bir şekilde bağlayabilirim?

Yanıtlar:


135

Bu şekilde olmalı:

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

İd niteliğini not edin .


75
bu şekilde çalışması için bir ListViewActivity kullanıyor olmanız gerekir.
Nathan Schwermann

2
oh, anlıyorum, benim ListView aslında bir ViewFlipper içinde. Liste boşken görünümü sunabilmemin başka bir yolu var mı?
Sheehan Alam

11
mantığı kendiniz uyguladınız, nasıl yaptıklarını görmek için ListViewActivity'nin kaynak koduna bakın veya sorgunuzun boş olup olmadığını kontrol edin, eğer öyleyse metin görünümünüzü GÖRÜNÜR olarak ayarlayın, aksi takdirde GONE olarak ayarlayın
Nathan Schwermann

4
özel bir bağdaştırıcı kullanırken metin görünümünü kullanma çalışmıyor.
user590849

3
@schwiz yanlış! boş işlevselliği kullanmak için ListViewActivity'ye ihtiyacınız yoktur.
Buffalo


118

Appsthatmatter'ın dediği gibi, düzende şöyle bir şey var:

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

ve bağlantılı Faaliyette:

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

Ayrıca bir GridView ile çalışır ...


4
En az bir saat çeşitli şeyleri denedikten ve hiçbir şey çalışmadığında (liste görünümündeki verilere ek olarak "boş" metni göstererek), bir Etkinlikte ListActivity'yi genişletmek yerine bir ListView kullanırken bu işe yaradı. Teşekkürler Eddy!
Evan R.

TextView'i gizli mi yapmalıyım?
Harsha MV

11
@Harsha android: görünürlük = "gitti"
scragar

42

Yukarıdaki tüm çözümleri denedim, sorunu çözdüm ve tam çözümü gönderiyorum.

Xml dosyası :

<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" ), boş liste görünümü için yer tutucudur.

Java sayfasının kodu:

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

Bağdaştırıcıyı listview.Mine'e bağladıktan sonra emptyView'u yerleştirmeyi unutmayın ve ilk kez çalışmadı ve setAdapter sonra setEmptyView taşındıktan sonra şimdi çalışıyor.

Çıktı:

resim açıklamasını buraya girin


1
Bu boşandroid:layout_below="@+id/lv_msglist" için ekledikten
Behnam Heydari

16

ViewStub'ları böyle kullanmanızı şiddetle tavsiye ederim

<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'den tam örneğe bakın


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

Destek kitaplığını kullanıyorsanız bu, FragmentActivity ile net bir şekilde çalışır. Bunu API 17 yani 4.2.2 imajı oluşturarak test edilmiştir.


7

Faaliyet kodu, uzatılması önemlidir 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));
    }
}

Düzen xml, her iki görünümdeki kimlik önemlidir.

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

Sadece yeni kimlikler oluşturmanız gerekmediğini eklemek için, aşağıdakine benzer bir şey işe yarayacaktır.

Düzende:

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

Sonra aktivitede:

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

4

Bu sorunu yaşadım. Sınıfımı Etkinlik yerine ListActivity'yi genişletmek ve XML'deki listemi yeniden adlandırmak zorunda kaldımandroid:id="@android:id/list"


2

Programlı bir çözüm:

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

Öncelikle listenin bazı değerler içerdiğini kontrol edin:

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

Tamamsa, aksi takdirde şunu kullanın:

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

a'nın ne olduğunu daha ayrıntılı olarak ele almak ister misiniz list?
Roy Lee

Bu bir ArrayList <xyz>
Avnish Kumar

Object [] response = Utility.parseStationresponce (nesne); int statusCode = (Tamsayı) yanıtı [0]; @SuppressWarnings ("işaretlenmemiş") ArrayList <Station> list = (ArrayList <Station>) yanıtı [2];
Avnish Kumar

Güzel, bunu cevabınızın bir parçası olarak yorumlardan daha koymanızı öneririm. Bu, başkalarının yazdıklarınızın belirli içeriğini anlamalarını sağlamak için önemlidir. Ayrıca, cevabınızı OP'nin sorusu ile ilişkilendirebilmeniz de en iyisidir. Son olarak, SO hoş geldiniz.
Roy Lee
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.