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_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
, нам не нужно передавать идентификатор в конструкторе для одного.