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