ListViewが空のときに空のビューを表示する


135

何らかの理由で、空のビュー(この場合は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、2010

2
そうそう、私のListViewは実際にはViewFlipperの中にあります。リストが空のときにビューを表示できる別の方法はありますか?
シーハンアラム

11
ロジックを自分で実装し、ListViewActivityのソースコードを調べてその方法を確認するか、クエリをチェックして空かどうかを確認する場合は、テキストビューをVISIBLEに設定し、そうでない場合はGONEに設定します。
Nathan Schwermann、2010

4
カスタムアダプターを使用しているときにtextviewを使用しても機能しません。
user590849 2011年

3
@schwiz false!空の機能を使用するために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
少なくとも1時間さまざまなことを試し、何も機能しない(リストビューのデータに加えて「空の」テキストが表示される)後、これはListActivityを拡張する代わりにアクティビティでListViewを使用するときに私にとってはうまくいきました。エディありがとう!
エヴァンR.

TextViewを非表示にする必要がありますか?
Harsha MV

11
@Harsha android:visibility = "gone"
2013年

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 / emptyElement")は、空のリストビューのプレースホルダーです。

Javaページのコードは次のとおりです。

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

アダプタをlistview.Mineにバインドした後、emptyViewを配置することを忘れないでください。Mineは最初は機能していませんでした。

出力:

ここに画像の説明を入力してください


1
これは、追加した後に私のために働いたandroid:layout_below="@+id/lv_msglist"ためemptyElement
Behnam Heydariを

16

このようなViewStubを使用することを強くお勧めします

<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、両方のビューのIDは重要です。

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

私はこの問題を抱えていました。私のクラスでActivityではなく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>です
Avnish Kumar 14年

Object [] response = Utility.parseStationresponce(object); int statusCode =(整数)response [0]; @SuppressWarnings( "unchecked")ArrayList <Stations> list =(ArrayList <Stations>)response [2];
Avnish Kumar 2014

よし、コメントよりも回答の一部としてそれを置くことをお勧めします。これは、あなたが書いている内容の特定のコンテキストを他の人に理解させるために重要です。さらに、あなたの答えをOPの質問に関連付けることができるのも最良です。最後に、SOへようこそ。
ロイ・リー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.