I've created some composie UIs in my android apps and there are some ListView controls -among other controls- inside a view. Because of this, I have used "Activity" as my activity base class.
Now I need to display a simple message like "No Item" when the ListView that is bound to my adapter is empty. I know this is possible when using ListActivity but I'm not sure what's the best approach for this?
You can have an empty view without a ListActivity
! The correct method is as follows
First add an 'empty view' to your layout XML below your list
... <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" /> ...
Next override the onContentChanged
method of your activity and set the empty view of your list to your empty view:
@Override public void onContentChanged() { super.onContentChanged(); View empty = findViewById(R.id.empty); ListView list = (ListView) findViewById(R.id.list); list.setEmptyView(empty); }
That's it! Android will take care of hiding/showing the list and empty view when you update the adapter.
The Magic
Deciding whether the empty view is shown or not is handled by the superclass of ListView
, AdapterView
. AdapterView
registers a DataSetObserver
on the set adapter so it is notified whenever the data is changed. This triggers a call to checkFocus
in AdapterView
which contains the following lines
if (mEmptyView != null) { updateEmptyStatus((adapter == null) || adapter.isEmpty()); }
and sets the empty view visibility based on whether the adapter is empty or not.
You're looking for the empty view of a ListActivity
:
ListActivity
If you're using ListView
you can use the method setEmptyView()
:
setEmptyView
Just combine your ListView
with 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>
Then check the count of items an chanche visibility on ListView
accordingly:
ListView lv = (ListView)findViewById(R.id.list);
lv.setVisibility((adapter.isEmpty())?View.GONE:View.VISIBLE);
If you are using Custom Adapter, you can do this in the overridden notifyDataSetChanged
method.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With