在ListView中显示“No Item”消息

时间:2011-04-06 11:17:51

标签: android

我在我的Android应用程序中创建了一些复合UI,并且在视图中有一些ListView控件 - 其他控件。因此,我使用“Activity”作为我的活动基类。

现在,当绑定到我的适配器的ListView为空时,我需要显示一条简单的消息,如“No Item”。我知道这在使用ListActivity时是可行的,但我不确定最好的方法是什么?

6 个答案:

答案 0 :(得分:98)

您可以在没有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将负责隐藏/显示列表和空视图。

魔术

决定是否显示空视图由ListViewAdapterView的超类处理。 AdapterView在设置适配器上注册DataSetObserver,以便在数据发生更改时通知它。这会触发对checkFocusAdapterView的调用,其中包含以下行

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

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

答案 1 :(得分:43)

您正在寻找ListActivity的空视图:

ListActivity

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

setEmptyView

答案 2 :(得分:9)

只需将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方法中执行此操作。

答案 3 :(得分:4)

您可以使用Toast Message ..

adapter.getCount()

检查适配器的计数值
if(Adapter.getCount()!=0){
      List.setAdapter(Adapter); 
}else{
     Toast.makeText(YourActivityName.this, "No Items Available",Toast.LENGTH_SHORT).show();
}

答案 4 :(得分:1)

对于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()函数。

答案 5 :(得分:1)

实现这一目标的最简单方法是使用ListFragment而不是ListActivity。 ListFragment具有以下便捷方法:

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

此外,使用ListFragment类还有其他优点。例如,可以将它与新的AppCompat库结合使用(由于必须从ActionBarActivity扩展而无法使用ListActivity)。