我在我的Android应用程序中创建了一些复合UI,并且在视图中有一些ListView控件 - 其他控件。因此,我使用“Activity”作为我的活动基类。
现在,当绑定到我的适配器的ListView为空时,我需要显示一条简单的消息,如“No Item”。我知道这在使用ListActivity时是可行的,但我不确定最好的方法是什么?
答案 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将负责隐藏/显示列表和空视图。
魔术
决定是否显示空视图由ListView
,AdapterView
的超类处理。 AdapterView
在设置适配器上注册DataSetObserver
,以便在数据发生更改时通知它。这会触发对checkFocus
中AdapterView
的调用,其中包含以下行
if (mEmptyView != null) {
updateEmptyStatus((adapter == null) || adapter.isEmpty());
}
并根据适配器是否为空来设置空视图可见性。
答案 1 :(得分:43)
答案 2 :(得分:9)
只需将ListView
与TextView
:
<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)。