Android ListView Adapter, как обнаружить пустой список?

У меня есть ListView в моей деятельности, который принимает значения из класса расширения SimpleAdapter. Это правильно работает, когда я добавляю или удаляю некоторые данные в нем.

Но моя проблема в том, что когда мой список элементов пуст, я хотел бы заменить listView сообщением типа «No item inhere» или что-то в этом роде.

Я пытался это сделать:

class FavAdapter extends SimpleAdapter{ Activity context; ArrayList<HashMap<String,String>> data; String[] items; int[] champs; int layout; FavAdapter(Activity _context, ArrayList<HashMap<String,String>> _data, int _layout, String[] _items, int[] _champs){ super(_context, _data, _layout, _items, _champs ); this.data = _data; this.context = _context; this.items = _items; this.layout = _layout; this.champs = _champs; } public View getView(int pos, View convertView, ViewGroup parent){ //Recycling View row = convertView; //Else get from XML if(row == null){ LayoutInflater infla = context.getLayoutInflater(); row = infla.inflate(layout, null); } //If there are data if(data.size() > 0){ /**** Here I am correctly constructing row *****/ ... } //Else else{ TextView txt = new TextView(ActivityFavoris.this); txt.setText("Not data inhere"); LinearLayout ll = (LinearLayout) row.findViewById(R.id.result_lyt_principal); ll.addView(txt); } return row; } 

Проблема в том, что мой список никогда не имеет значения 0. Фактически, когда данные пустые, адаптер не вызывается.

Может кто-нибудь объяснить мне, как я могу это сделать по-другому? Заранее спасибо.

Изменить: Используя ваши ответы, мне это удается. Мое решение: setContentView должно использоваться с findViewById (android.R.id.empty), но, если у вас есть два разных listView в вашей деятельности, которым нужны разные пустые представления, вам придется найти их в другом макете. Таким образом, андроид автоматически выберет правильный вид, когда список будет пустым, и ничего не нужно делать в адаптере, когда data.size равно 0.

Пример: в действии:

 public void onCreate(Bundle b){ super.onCreate(b); lv1 = (ListView) findViewById(R.id.listviewone); lv2 = (ListView) findViewById(R.id.listviewtwo); //****set listview adater***// ... //set empty view lv1.setEmptyView(findViewById(R.id.layoutone).findViewById(android.R.id.empty)); lv2.setEmptyView(findViewById(R.id.layouttwo).findViewById(android.R.id.empty)); } 

С этим xml:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/layoutone" android:orientation="horizontal" android:layout_weight="1" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/listviewone" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <TextView android:id="@android:id/empty" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Pas de favoris enregistrées" /> </LinearLayout> <LinearLayout android:id="@+id/layouttwo" android:orientation="horizontal" android:layout_weight="1" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/listviewtwo" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <TextView android:id="@android:id/empty" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Pas de favoris enregistrées" /> </LinearLayout> 

Solutions Collecting From Web of "Android ListView Adapter, как обнаружить пустой список?"

Используйте метод setEmptyView, который устанавливает представление, чтобы показать, является ли адаптер пустым.

Вышеупомянутый ответ звучит отлично, но для записи причина, по которой ваш метод не вызывается, вероятно, потому, что ваша реализация getCount () возвращает что-то вроде data.size () – значение 0. Это означает, что ListView никогда не вызовет getView вообще.

Вместо этого вы могли бы сделать что-то вроде этого:

 public int getCount() { if (data.size()==0) { return 1; } return data.size(); } 

Надеюсь, это полезно.

Вы вызываете этот адаптер в какой-то активности. Там адаптер установлен в любое listview. Перед установкой адаптера в представление списка вы можете проверить, что такое размер arraylist. Если размер равен нулю, вы можете добавить сообщение "No item inhere" в arraylist, сделав хэш-карту

Создайте список с пометкой «нет элементов» по ​​умолчанию. Когда первый элемент добавлен, заново создайте список и удалите запись по умолчанию.