当ListView为空时显示空视图

140

由某些原因,空视图,在这种情况下是一个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>

如何正确地连接空视图?

11个回答

189

当你扩展FragmentActivityActivity不是ListActivity时,你需要查看以下内容:

ListView.setEmptyView()


(请注意:已根据要求保留了HTML标记)

有任何想法如何在App Inventor中实现吗? - JinSnow

137

应该是这样的:

<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 的源代码来了解其实现方式,或者在进行查询时检查是否为空,如果是,则将文本视图设置为可见,否则将其设置为隐藏。 - Nathan Schwermann
4
当您使用自定义适配器时,使用TextView不起作用。 - user590849
3
@schwiz 错了!你不需要一个 ListViewActivity 才能使用“空数据”功能。 - Buffalo
显示剩余4条评论

120

正如appsthatmatter所说,在布局中类似以下的内容:

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

并且在链接的Activity中:

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

也适用于GridView...


4
尝试了至少一个小时的各种方法后,什么都没用(除了在列表视图中显示“空”文本外,还有数据),但是当我在活动中使用ListView而不是扩展ListActivity时,这个方法对我起作用了。谢谢Eddy! - Evan R.
我应该将TextView隐藏或做些其他操作吗? - Harsha M V
11
@Harsha android:visibility="gone" 的意思是“不可见”,在Android应用程序中使用该属性可以隐藏一个视图,使其在屏幕上不可见。 - scragar

44

我尝试了以上所有解决方案,最终解决了这个问题。在这里我发布完整的解决方案。

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之后放置emptyView。我第一次使用时没有起作用,然后我将setEmptyView移到setAdapter之后,现在它可以工作了。


1
在_emptyElement_中添加android:layout_below="@+id/lv_msglist"后,这个对我起作用了。 - Bheid

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

补充一点,您实际上不需要创建新的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));

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>

4

我曾经遇到过这个问题。为了解决它,我需要将我的类扩展为ListActivity而不是Activity,并将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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接