Отображение пустого представления, когда 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.