Отображение пустого представления, когда ListView пуст

По какой-то причине пустой вид, TextView в этом случае, всегда появляется, даже если ListView не пуст. Я думал, что ListView автоматически обнаружит, когда показывать пустой вид.

<RelativeLayout android:id="@+id/LinearLayoutAR" android:layout_height="fill_parent" android:layout_width="fill_parent"> <ListView android:id="@+id/ARListView" android:layout_width="fill_parent" android:layout_height="fill_parent"></ListView> <ProgressBar android:id="@+id/arProgressBar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true"></ProgressBar> <!-- Here is the view to show if the list is emtpy --> <TextView android:id="@id/android:empty" android:layout_width="match_parent" android:layout_height="match_parent" android:text="No Results" /> </RelativeLayout> 

Как я могу правильно подключить пустой вид?

Solutions Collecting From Web of "Отображение пустого представления, когда ListView пуст"

Это должно быть так:

 <TextView android:id="@android:id/empty" android:layout_width="match_parent" android:layout_height="match_parent" android:text="No Results" /> 

Обратите внимание на атрибут id .

Когда вы расширяете FragmentActivity или Activity а не ListActivity , вам нужно взглянуть на:

ListView.setEmptyView ()

Как говорит appsthatmatter, в макете что-то вроде:

 <ListView android:id="@+id/listView" ... /> <TextView android:id="@+id/emptyElement" ... /> 

И в связанной работе:

 this.listView = (ListView) findViewById(R.id.listView); this.listView.setEmptyView(findViewById(R.id.emptyElement)); 

Также работает с GridView …

Я попробовал все вышеперечисленные решения. Я придумал решение проблемы. Я отправляю полное решение.

Файл xml :

 <RelativeLayout android:id="@+id/header_main_page_clist1" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="20dp" android:paddingBottom="10dp" android:background="#ffffff" > <ListView android:id="@+id/lv_msglist" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@color/divider_color" android:dividerHeight="1dp" /> <TextView android:id="@+id/emptyElement" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="NO MESSAGES AVAILABLE!" android:textColor="#525252" android:textSize="19.0sp" android:visibility="gone" /> </RelativeLayout> 

TextView ( «@ + id / emptyElement» ) является заполнителем для пустого списка.

Вот код для java-страницы:

 lvmessage=(ListView)findViewById(R.id.lv_msglist); lvmessage.setAdapter(adapter); lvmessage.setEmptyView(findViewById(R.id.emptyElement)); 

Не забудьте разместить пустое окно после привязки адаптера к listview.Mine не работал в первый раз, и после того, как я переместил setEmptyView после setAdapter, он теперь работает.

Вывод:

Введите описание изображения здесь

Я настоятельно рекомендую вам использовать ViewStubs, как это

 <FrameLayout android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" > <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <ViewStub android:id="@android:id/empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout="@layout/empty" /> </FrameLayout> 

См. Полный пример Кирилла Моттье

 <ListView android:id="@+id/listView" ... /> <TextView android:id="@+id/empty" ... /> and in the linked Activity: this.listView = (ListView) findViewById(R.id.listView); this.listView.setEmptyView(findViewById(R.id.empty)); 

Это хорошо работает с FragmentActivity, если вы используете библиотеку поддержки. Протестировали это, построив для API 17, т.е. изображение 4.2.2.

Просто добавьте, что вам действительно не нужно создавать новые идентификаторы, что-то вроде следующего будет работать.

В макете:

 <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@android:id/list"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@android:id/empty" android:text="Empty"/> 

Затем в деятельности:

  ListView listView = (ListView) findViewById(android.R.id.list); listView.setEmptyView(findViewById(android.R.id.empty)); 

Код действия, его важно расширить ListActivity .

 package com.example.mylistactivity; import android.app.ListActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import com.example.mylistactivity.R; // It's important to extend ListActivity rather than Activity public class MyListActivity extends ListActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mylist); // shows list view String[] values = new String[] { "foo", "bar" }; // shows empty view values = new String[] { }; setListAdapter(new ArrayAdapter<String>( this, android.R.layout.simple_list_item_1, android.R.id.text1, values)); } } 

Макет xml, идентификатор в обоих представлениях важен.

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <!-- the android:id is important --> <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent"/> <!-- the android:id is important --> <TextView android:id="@android:id/empty" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="i am empty"/> </LinearLayout> 

У меня была эта проблема. Я должен был сделать свой класс расширенным ListActivity, а не Activity, и переименовать мой список в XML в android:id="@android:id/list"

Сначала проверьте список, содержащий некоторые значения:

 if (list.isEmpty()) { listview.setVisibility(View.GONE); } 

Если это тогда ОК, в противном случае используйте:

 else { listview.setVisibility(View.VISIBLE); }