在ListView中显示“No Item”消息

我在我的android应用程序中创build了一些组合用户界面,并且在视图内部还有一些ListView控件 – 其他控件。 正因为如此,我使用“活动”作为我的活动基类。

现在我需要显示一个简单的消息,如“没有项目”,当绑定到我的适配器的ListView是空的。 我知道这是可能的使用ListActivity时,但我不知道什么是最好的办法呢?

你正在寻找一个ListActivity的空视图:

http://developer.android.com/reference/android/app/ListActivity.html

如果您使用ListView,则可以使用setEmptyView()方法:

http://developer.android.com/reference/android/widget/AdapterView.html#setEmptyView(android.view.View);

没有ListActivity你可以有一个空的视图! 正确的方法如下

首先在您的列表下面的布局XML中添加一个“空视图”

 ... <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <TextView android:id="@+id/empty" android:text="Empty" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" /> ... 

接下来,重写您的活动的onContentChanged方法,并将列表的空视图设置为空视图:

 @Override public void onContentChanged() { super.onContentChanged(); View empty = findViewById(R.id.empty); ListView list = (ListView) findViewById(R.id.list); list.setEmptyView(empty); } 

而已! 当您更新适配器时,Android将负责隐藏/显示列表和空视图。

魔术

确定是否显示空的视图是由ListView的超类, AdapterViewAdapterView在设置的适配器上注册DataSetObserver ,以便在数据更改时通知它。 这触发了AdapterView中包含以下行的AdapterView调用

 if (mEmptyView != null) { updateEmptyStatus((adapter == null) || adapter.isEmpty()); } 

并根据适配器是否为空来设置空视图可见性。

只要将你的ListViewTextView结合起来:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@+id/list" android:layout_height="fill_parent" android:layout_width="fill_parent" /> <TextView android:id="@+id/list_empty" android:text="No Item" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"/> </LinearLayout> 

然后检查ListView相应项目的可见性计数:

  ListView lv = (ListView)findViewById(R.id.list); lv.setVisibility((adapter.isEmpty())?View.GONE:View.VISIBLE); 

如果使用自定义适配器,则可以在重写的notifyDataSetChanged方法中执行此notifyDataSetChanged

你可以使用吐司消息这个..

通过adapter.getCount()检查适配器的计数值

 if(Adapter.getCount()!=0){ List.setAdapter(Adapter); }else{ Toast.makeText(YourActivityName.this, "No Items Available",Toast.LENGTH_SHORT).show(); } 

对于Joseph的布局代码,您需要编辑@ + id / list和@ + id / empty到@android:id / * ,如:

 <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <TextView android:id="@android:id/empty" android:text="Empty" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" /> 

这样,你甚至不需要重写onContentChanged()函数。

最简单的方法是使用ListFragment而不是ListActivity。 ListFragment具有以下便利方法:

 setEmptyText("My no items message..."); 

另外,使用ListFragment类还有其他的好处。 例如,可以将它与新的AppCompat库结合起来(因为您必须从ActionBarActivity进行扩展,所以您无法使用ListActivity进行操作)。