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
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
Что не так с моим кодом?
Когда у меня есть элементы, я вижу их в списке. Но когда список пуст, я не вижу TextView
.
Ответы
Ответ 1
проблема в том, что я должен сделать 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);
теперь его тонкий
Ответ 2
Ваш 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);
Ответ 3
Для меня ни один из этих ответов не работал у меня. Мне нужно было добавить пустое представление вручную (завышенное) в "родительский" вид 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);
Ответ 4
Самый простой способ использовать 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));
Ответ 5
Попробовав все представленные здесь решения и поэкспериментировав, я считаю, что приведенный ниже код - лучший метод для использования, когда ваш ListView и пустой вид не являются бок о бок в макете с набором автоматических идентификаторов.
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 занимает все видимое пространство Activity. Вместо того, чтобы ваш пустой вид являлся родным братом в ListView, он заканчивается тем, что является родным братом на других макетах корневого уровня в вашей деятельности. Кажется, он работает, потому что он плавает (z-порядок) поверх всех других видов в активности. См.: Activity.addContentView(View) == ViewGroup.addContentView(View)?
Ответ 6
Ядро проблемы состоит в том, что класс AdapterView фактически не добавляет представление, которое вы передаете setEmptyView() в любой контейнер. Это просто меняет видимость. Есть много способов поместить объект "пустой вид" в контейнер, как описывают другие ответы.
Документация для AdapterView должна быть действительно обновлена, чтобы отразить это, поскольку это не очевидно.
Ответ 7
Создайте макет в XML, который определяет как ListView
, так и пустой вид, который вы хотите использовать. Если вы дадите им идентификаторы @android:id/list
и @android:id/empty
, андроид автоматически будет использовать представление с id:empty
, когда список пуст.
Ответ 8
Есть несколько правильных решений, но я считаю, что это лучший подход!
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);
Ответ 9
также эти два метода помогли мне отобразить пустой вид:
adapter.notifyDataSetChanged();
list.invalidateViews();
Ответ 10
Просто используйте
View emptyView = getLayoutInflater().inflate(R.layout.empty_view, null);
((ViewGroup)listView.getParent()).addView(emptyView);
Вместо listView.setEmptyView(emptyView);
Ответ 11
Моя проблема заключалась в том, что я добавил нижний колонтитул, который, похоже, не работает с пустым представлением.
После удаления нижнего колонтитула отображается пустой вид.
Ответ 12
Я только что изучил 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);