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


135

По какой-то причине пустое представление, в данном случае 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>

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

Ответы:


135

Должно быть так:

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

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


75
Вы должны использовать ListViewActivity, чтобы он работал таким образом.
Натан Шверманн

2
о, я вижу, мой ListView на самом деле внутри ViewFlipper. Есть ли другой способ представить представление, когда список пуст?
Шихан Алам

11
Вы реализовали логику самостоятельно, взгляните на исходный код ListViewActivity, чтобы увидеть, как они это делают, или когда вы проверяете запрос, чтобы убедиться, что он пуст, в таком случае установите текстовое представление на VISIBLE, в противном случае установите его на GONE.
Натан Шверманн

4
использование textview при использовании нестандартного адаптера не работает.
user590849

3
@schwiz ложь! вам не нужно ListViewActivity, чтобы использовать пустую функциональность.
Буффало


118

Как говорит 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 ...


4
После, по крайней мере, часа пробования различных вещей и отсутствия работы (показывая «пустой» текст в дополнение к данным в просмотре списка), это сработало для меня при использовании ListView в Activity вместо расширения ListActivity. Спасибо, Эдди!
Эван Р.

Должен ли я сделать TextView скрытым или что-то?
Харша М.В.

11
@Harsha android: видимость = "ушел"
скраг

42

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

Файл 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));

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

Вывод:

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


1
это работает для меня после добавления android:layout_below="@+id/lv_msglist"для emptyElement
Бенам Хейдари

16

Я настоятельно рекомендую вам использовать 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>

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


8
<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.


7

Код активности, его важно расширять 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>

7

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

В макете:

<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));

4

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


2

Программным решением будет:

TextView textView = new TextView(context);
textView.setId(android.R.id.empty);
textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
textView.setText("No result found");
listView.setEmptyView(textView);

-3

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

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

Если все в порядке, в противном случае используйте:

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

Вы хотели бы уточнить, что это такое list?
Рой Ли

Это ArrayList <xyz>
Авниш Кумар

Object [] response = Utility.parseStationresponce (object); int statusCode = (Integer) response [0]; @SuppressWarnings ("unchecked") ArrayList <Stations> list = (ArrayList <Stations>) response [2];
Авниш Кумар

Что ж, хорошо, я предлагаю вам включить это в свой ответ, а не в комментарии. Это важно, чтобы другие поняли конкретный контекст того, что вы пишете. Кроме того, также лучше, если вы можете связать свой ответ с вопросом ОП. Наконец, добро пожаловать в ТАК.
Рой Ли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.