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 ответ:
Вы немного перепутали свои макеты.
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_textTextViewчтобы быть вашим пользовательским расположением строк. Если это так, удалите его из макета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, нам не нужно передавать идентификатор в конструкторе для одного.