Подтвердить что ты не робот

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.

4b9b3361

Ответ 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);