ListView为空时显示空视图

出于某种原因,在这种情况下,即使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> 

我怎样才能正确地连接空视图?

应该是这样的:

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

请注意id属性。

当你扩展FragmentActivityActivity不是 ListActivity ,你需要看看:

ListView.setEmptyView()

正如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 …

我尝试了所有上述解决scheme。我想出了解决这个问题的方法。在这里我发布了完整的解决scheme。

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放置在第一次不工作,并且在setAdapter之后将setEmptyView移动到现在正在工作之后。

输出:

在这里输入图像说明

我强烈build议你使用这样的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的完整示例

 <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清楚地工作。 通过构buildAPI 17(即4.2.2图像)来testing这一点。

只是补充一点,你不需要创build新的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)); 

活动代码,它对于扩展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> 

我有这个问题。 我不得不让我的类扩展ListActivity而不是活动,并重新命名我的列表XML到android:id="@android:id/list"

首先检查包含一些值的列表:

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

如果是的话,否则使用:

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