ListView为空时显示空视图


135

由于某种原因,即使ListView不为空,空视图(在这种情况下为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>

如何正确连接空视图?

Answers:


135

应该是这样的:

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

注意id属性。


75
您必须使用ListViewActivity使其以这种方式工作。
内森·史威文

2
哦,我知道,我的ListView实际上在ViewFlipper中。当列表为空时,还有其他方法可以显示视图吗?
Sheehan Alam

11
您已经自己实现了逻辑,请查看ListViewActivity的源代码以了解其操作方式,或者在进行查询检查以查看其是否为空时(如果这样),请将文本视图设置为VISIBLE,否则将其设置为GONE
内森·史威文

4
使用自定义适配器时使用textview不起作用。
user590849 2011年

3
@schwiz错误!您不需要ListViewActivity即可使用空功能。
布法罗2012年


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中的数据之外,还显示了“空”文本),当我在Activity中使用ListView而不是扩展ListActivity时,这对我来说很有用。谢谢涡流!
Evan R.

我应该隐藏TextView还是其他?
Harsha MV

11
@Harsha android:visibility =“ gone”
scragar 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之后放置emptyView.Mine第一次不工作,并且在setAdapter之后我将setEmptyView移动之后,它现在可以工作了。

输出:

在此处输入图片说明


1
这个工作对我来说加入后android:layout_below="@+id/lv_msglist"emptyElement
贝南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,两个视图中的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

我有这个问题。我必须让我的类扩展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);

-3

首先检查列表中是否包含一些值:

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

如果可以,请使用:

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

您是否愿意进一步阐述什么是list
罗伊·李

这是一个ArrayList <xyz>
Avnish Kumar

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

很好,建议您将其作为回答的一部分,而不是评论。这对于让其他人理解您所写内容的特定上下文很重要。此外,最好将您的答案与OP的问题联系起来。最后,欢迎来到SO。
罗伊·李
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.