Показує порожній вигляд, коли 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, щоб побачити, як вони це роблять, або коли ви зробите свій запит, щоб перевірити, чи порожній він, якщо так встановити подання тексту на ВІДМОВНЕ, інакше встановіть його на GONE
Натан Шверман

4
використання текстового перегляду під час використання користувацького адаптера не працює.
користувач590849

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 в діяльності, а не розширював ListActivity. Дякую, Едді!
Еван Р.

Чи варто зробити TextView прихованим чи щось?
Харша М. В.

11
@Harsha android: visibility = "gone"
scragar

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

Не забудьте розмістити порожній вигляд після прив’язки адаптера до 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, а не активність, і перейменувати свій список у 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 [] відповідь = Utility.parseStationresponce (об'єкт); int statusCode = (Integer) відповідь [0]; @SuppressWarnings ("не встановлено") відповідь ArrayList <Station> list = (ArrayList <Station>) [2];
Авніш Кумар

Ну добре, я пропоную вам поставити це як частину своєї відповіді, ніж коментарі. Це важливо, щоб інші зрозуміли конкретний контекст того, що ви пишете. Крім того, найкраще, якщо ви зможете співвіднести свою відповідь на питання ОП. Нарешті, ласкаво просимо до SO.
Рой Лі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.