ListFragment с пользовательским макетом: всегда отображается пустое сообщение


Я создал пользовательский макет для ListFragment, используя значение по умолчанию ArrayAdapter. Моя проблема заключается в том, что пустое сообщение отображается в каждой строке, когда список не пуст (когда список пуст, сообщение отображается только один раз, как и ожидалось).

Headline_list.xml (то есть мой пользовательский файл макета)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:id="@id/android:list" />

    <TextView android:id="@+id/my_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView android:id="@id/android:empty"
        android:text="There are no data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/> 

</LinearLayout>

Фрагмент заголовка.java

public class HeadlineFragment extends ListFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        return inflater.inflate(R.layout.headline_list, container, false);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        List<String> headlines = ...;          // populate headlines list

        setListAdapter(new ArrayAdapter<String>(getActivity(),
                R.layout.headline_list, R.id.my_text, headlines));
    }
}

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

1 3

1 ответ:

Вы немного перепутали свои макеты.

new ArrayAdapter<String>(getActivity(),
    R.layout.headline_list, R.id.my_text, headlines)

Второй параметр в конструкторе ArrayAdapter должен быть идентификатором для макета отдельной строки, а не всего макета Fragment. Третий параметр ссылается на TextView в макете строки для отображения данных элемента.

Вы можете предоставить свой собственный макет строки,или вы можете использовать один из предоставленных SDK. Пример последнего:

new ArrayAdapter<String>(getActivity(),
    android.R.layout.simple_list_item_1, headlines)

В этом примере android.R.layout.simple_list_item_1 сам по себе является Просто TextView, поэтому нам не нужно предоставьте идентификатор для одного.

Кроме того, вы должны рассмотреть возможность сохранения ссылки на адаптер, Если вам потребуется позже изменить его.


Похоже, что вы имеете в виду для my_text TextView чтобы быть вашим пользовательским расположением строк. Если это так, удалите его из макета Fragment, headline_list, и поместите его в свой собственный файл макета; например, list_row.xml. Ваши файлы компоновки будут выглядеть следующим образом:

headline_list.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <TextView android:id="@id/android:empty"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="There are no data" /> 

</LinearLayout>

list_row.xml

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

Затем вы создадите экземпляр вашего адаптера, как Итак:

new ArrayAdapter<String>(getActivity(), R.layout.list_row, headlines)

Опять же, поскольку компоновка строк-это Просто TextView, нам не нужно передавать идентификатор в конструкторе для одного.