Ответ 1
Вы ищете пустой вид ListActivity:
http://developer.android.com/reference/android/app/ListActivity.html
Если вы используете ListView, вы можете использовать метод setEmptyView():
Я создал некоторые пользовательские интерфейсы в моих приложениях для Android, и есть некоторые элементы управления ListView - помимо других элементов управления - внутри представления. Из-за этого я использовал "Активность" в качестве базового класса активности.
Теперь мне нужно отобразить простое сообщение типа "Нет элемента", когда ListView, привязанный к моему адаптеру, пуст. Я знаю, что это возможно при использовании ListActivity, но я не уверен, какой лучший подход для этого?
Вы ищете пустой вид ListActivity:
http://developer.android.com/reference/android/app/ListActivity.html
Если вы используете ListView, вы можете использовать метод setEmptyView():
У вас может быть пустой вид без 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
регистрирует a DataSetObserver
на адаптере, поэтому он уведомляется о каждом изменении данных. Это вызывает вызов checkFocus
в AdapterView
, который содержит следующие строки
if (mEmptyView != null) {
updateEmptyStatus((adapter == null) || adapter.isEmpty());
}
и устанавливает видимость пустого представления в зависимости от того, пуст или нет адаптер.
Просто соедините 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);
Если вы используете Custom Adapter, вы можете сделать это в переопределенном методе notifyDataSetChanged
.
Вы можете использовать Toast Message для этого.
Проверьте значение Count of the Adapter на adapter.getCount()
if(Adapter.getCount()!=0){
List.setAdapter(Adapter);
}else{
Toast.makeText(YourActivityName.this, "No Items Available",Toast.LENGTH_SHORT).show();
}
Для кода макета Джозефа вам нужно отредактировать @+ 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 (которую вы не можете сделать с ListActivity, потому что вам нужно перейти от ActionBarActivity).