Как отобразить TextView, когда ListView пуст?

У меня есть ListFragment, который возвращает ListView. Если в списке нет элементов, я бы хотел вместо этого отобразить альтернативный TextView. Предположительно, вы можете добавить элемент TextView android:id="@android:id/empty" в XML.

Но...

Добавление FrameLayout, содержащего оба ListView и TextView, предсказуемо дает мне "FrameLayout нельзя привести к ListView".

Я также не могу просто добавить элемент TextView. "Разметка в документе, следующая за корневым элементом, должна быть правильной формы".

И я не могу переключиться на View вместо ListView, потому что это уже не будет списком.

... как мне это сделать?

Код:

    @Override
public View onCreateView ( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) {

    adapter = new ArrayAdapter<Project> ( getActivity (), android.R.layout.simple_list_item_1 );
    arrayList = ProjectManager.getProjectList ( getActivity () );
    for ( Project p : arrayList ) {
        if ( p.getStatus () == Project.ONGOING ) {
            adapter.add ( p );
        }
    }

    ListView listView = ( ListView ) inflater.inflate ( R.layout.list, container, false );
    listView.setAdapter ( adapter );

    return listView;
}

XML:

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

person abc32112    schedule 11.11.2013    source источник


Ответы (3)


У меня есть ListFragment, который возвращает ListView. Если в списке нет элементов, я бы хотел вместо этого отобразить альтернативный TextView. Предположительно вы можете добавить элемент TextView android:id="@android:id/empty" в XML.

Вы можете.

Добавление FrameLayout, содержащего как ListView, так и TextView, предсказуемо дает мне «FrameLayout нельзя преобразовать в ListView».

Это из-за ошибки в вашем коде, где вы предполагаете, что результаты inflate() являются ListView. Измените это, чтобы использовать findViewById() для нахождения ListView в увеличенном макете.

person CommonsWare    schedule 11.11.2013
comment
Я пробовал следующее, но это дает мне указанный ребенок уже имеет родителя. Код: ListView listView = ( ListView ) inflater.inflate ( R.layout.list_projects_ongoing, container, false ).findViewById ( R.id.listView ); - person abc32112; 11.11.2013
comment
@CaptainHindsight: эта строка не дает вам этой ошибки. Что-то еще может быть, но не эта линия. Также вам нужно вернуть результаты inflate() из onCreateView(), а в вашем случае нельзя, так как вы выбрасываете результаты inflate(). - person CommonsWare; 11.11.2013

добавить TextView с пустым идентификатором:

<TextView android:id="@android:id/empty"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="@string/emptyt_message" />

в том же макете

person Blackbelt    schedule 11.11.2013

Пожалуйста, взгляните на следующий метод:

http://developer.android.com/reference/android/widget/AdapterView.html#setEmptyView(android.view.View)

Чтобы это было полезно, ваш фрагмент должен состоять из контейнера (то есть FrameLayout), содержащего как ListView, так и TextView с вашим пустым сообщением.

При раздувании макета укажите идентификатор представления текстового представления. Установите начальную видимость этого текстового представления на INVISIBLE. Видимость текстового представления обновляется автоматически в соответствии с количеством элементов в вашем адаптере.

person Jonas Winkler    schedule 11.11.2013