Отображение пустого представления, когда 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, чтобы использовать пустую функциональность.
Буффало
187

При расширении FragmentActivityили Activityи не ListActivity , вы хотите взглянуть на:

ListView.setEmptyView ()

appsthatmatter
источник
Есть идеи, как это сделать в приложении изобретателя?
JinSnow
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, он теперь работает.

Вывод:

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

kgandroid
источник
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>

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

LOG_TAG
источник
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.

Yaojin
источник
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>
Mizipzor
источник
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"

Matt
источник
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);
Mika
источник
-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];
Авниш Кумар
Что ж, хорошо, я предлагаю вам включить это в свой ответ, а не в комментарии. Это важно, чтобы другие поняли конкретный контекст того, что вы пишете. Кроме того, также лучше, если вы можете связать свой ответ с вопросом ОП. Наконец, добро пожаловать в ТАК.
Рой Ли