SetEmptyView в ListView не показывает его вид в приложении для Android

Привет, проблема с методом setEmptyView из ListView.

Вот мой код Java:

ListView view = (ListView)findViewById(R.id.listView1); view.setEmptyView(findViewById(R.layout.empty_list_item)); ArrayAdapter<Session> adapter1 = new ArrayAdapter<Session>(this, android.R.layout.simple_list_item_1, android.R.id.text1, MainController.getInstanz().getItems()); view.setAdapter(adapter1); 

empty_list_item:

 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/emptyList" > </TextView> 

Посмотреть список:

 <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" > 

Что не так с моим кодом? Когда у меня есть элементы, я вижу их в списке. Но когда список пуст, я не вижу TextView .

Solutions Collecting From Web of "SetEmptyView в ListView не показывает его вид в приложении для Android"

Ваш TextView должен быть помещен прямо под элементом ListView с видимостью видимости (android: visibility = "gone"), не размещайте его в другом макете. Так будет выглядеть ваш основной макет

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/listViewFangbuch" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> <TextView android:id="@+id/empty_list_item" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" android:text="@string/emptyList" > </TextView> </LinearLayout> 

И вот как выглядит ваш код

 ListView view = (ListView)findViewById(R.id.listViewFangbuch); view.setEmptyView(findViewById(R.id.empty_list_item)); ArrayAdapter<Session> adapter1 = new ArrayAdapter<Session>(this, android.R.layout.simple_list_item_1, android.R.id.text1, MainController.getInstanz().getItems()); view.setAdapter(adapter1); 

Проблема в том, что я должен сделать addContentView:

 View empty = getLayoutInflater().inflate(R.layout.empty_list_item, null, false); addContentView(empty, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); view.setEmptyView(empty); 

Теперь его штраф

Для меня ни один из этих ответов не работал для меня. Мне нужно было добавить пустое представление вручную (завышенное) в «родительский» вид Listview:

 ListView my_list = (ListView) findViewById(R.id.my_list); View emptyView = getLayoutInflater().inflate(R.layout.empty_view,null); ((ViewGroup)my_list.getParent()).addView(emptyView); listView.setEmptyView(emptyView); 

Самый простой способ использования setEmptyView() – с вашим «пустым» TextView и ListView в том же макете, что и в следующем:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/empty_list_item" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/emptyList" android:visibility="gone" /> </LinearLayout> 

Теперь вы можете использовать:

 view.setEmptyView(findViewById(R.id.empty_list_item)); 

Попробовав все представленные здесь решения и поэкспериментировав, я считаю, что приведенный ниже код – лучший метод для использования, когда ваш ListView и пустой View не являются бок о бок в макете с набором автоматических идентификаторов.

 ViewGroup parentGroup = (ViewGroup)getListView().getParent(); View empty = getActivity().getLayoutInflater().inflate(R.layout.list_empty_view, parentGroup, false); parentGroup.addView(empty); getListView().setEmptyView(empty); 

Обоснование:

  • Передавая родительскую группу в раздувание, атрибуты layout_ * вашего пустого макета видны
  • Не прикрепляя представление в inflate (ложный параметр), возвращается пустой вид. В противном случае, inflate вернет родителя, требуя от нас использовать parentGroup.findViewById (empty_view_id), чтобы получить пустой вид для использования с setEmptyView (). Здесь мы избегаем дополнительного поиска, необходимости в другом идентификаторе и необходимости раскрывать этот идентификатор в нашем коде. Если нам не нужно было сохранять ссылку на пустое место, заявив, что надувание для прикрепления будет правильным действием, устраняющим необходимость вызова addView.
  • Анти-шаблон, addContentView (), не является правильным подходом. Он будет выглядеть эквивалентно, пока ваш ListView занимает все видимое пространство вашей деятельности. Вместо того, чтобы ваш пустой вид являлся родным братом в ListView, он заканчивается тем, что является родным братом на других макетах корневого уровня в вашей деятельности. Он работает, потому что он плавает (z-порядок) поверх всех других видов в активности. См .: Activity.addContentView (View) == ViewGroup.addContentView (View)?

Основная проблема заключается в том, что класс AdapterView фактически не добавляет представление, которое вы передаете в setEmptyView (), в любой контейнер. Это просто меняет видимость. Есть много способов поместить объект «пустой вид» в контейнер, как описывают другие ответы.

Документация для AdapterView должна быть действительно обновлена, чтобы отразить это, поскольку это не очевидно.

Создайте макет в XML, который определяет как ListView и пустой вид, который вы хотите использовать. Если вы дадите им IDs @android:id/list и @android:id/empty , андроид автоматически будет использовать представление с id:empty когда список пуст.

Есть несколько правильных решений, но я думаю, что это лучший подход!

 View emptyView = getLayoutInflater().inflate(R.layout.empty_list_cart, null); addContentView(emptyView, listView.getLayoutParams()); // You're using the same params as listView listView.setEmptyView(emptyView); listView.setAdapter(adapter); 

Также эти два метода помогли мне отобразить пустой вид:

  adapter.notifyDataSetChanged(); list.invalidateViews(); 

Просто используйте,

 View emptyView = getLayoutInflater().inflate(R.layout.empty_view, null); ((ViewGroup)listView.getParent()).addView(emptyView); 

Вместо listView.setEmptyView(emptyView);

Моя проблема заключалась в том, что я добавил нижний колонтитул, который, похоже, не работает с пустым представлением. После удаления нижнего колонтитула отображается пустой вид.

Я только что изучил android, но фрагмент из https://developer.android.com/guide/topics/ui/layout/listview.html изображает другой подход:

 // Create a progress bar to display while the list loads ProgressBar progressBar = new ProgressBar(this); progressBar.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER)); progressBar.setIndeterminate(true); getListView().setEmptyView(progressBar); // Must add the progress bar to the root of the layout ViewGroup root = (ViewGroup) findViewById(android.R.id.content); root.addView(progressBar); 

ViewGroup root = (ViewGroup) findViewById (android.R.id.content);