Intereting Posts
Как я могу получить доступ к альфа-версии моего приложения для Android в Google Play? Интеграция Дженкинса и атласского бамбука Не удалось запустить сервис Intent {act = com.google.android.c2dm.intent.REGISTER (есть дополнительные функции)}: не найден Защита постоянной строки от обратного проектирования Android ADT bundle Панель действий показывается некоторое время, прежде чем применять к ней пользовательский вид Программировать поворот с возможностью поворота или просмотра Как заменить эллипсы на fade / fading edge в textview в Android sdk? Как использовать полосу прокрутки и быстро Прокрутите до NestedScrollView NTLM аутентификация в Android Android NDK: Ошибка: должна быть включена с параметрами -std = c ++ 11 или -std = gnu ++ 11 Настраивать маркер изображения, высоту и ширину Мне нужно отправить файл изображения на сервер Clarifai для классификации изображений, но я продолжаю получать «пропущенные рамки, приложение делает слишком много работы», Автоматически добавлять / синхронизировать контакты Firebase не выбрасывает сеттер / поле для photo_url, найденного в классах моделей. Post $ Photo

Пользовательский пустой вид для ListFragment в XML

Я пытаюсь изменить существующий код, будучи новым для Android. Дайте мне знать, если какие-либо из понятий или предположений, которые я объясняю, не имеют смысла в этом мире!

Моя цель – определить макет в XML для пустого представления моего списка. Сегодня у нас есть эта функциональность, программно настраивая пустое представление по умолчанию в onActivityCreated моего CustomListFragment получаемого из ListFragment :

 setEmptyText(getResources().getString(R.string.listview_empty)); TextView emptyTextView = (TextView) getListView().getEmptyView(); emptyTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.listview_empty_text_size)); emptyTextView.setTextColor(getResources().getColor(R.color.listview_empty_text)); 

Я бы предпочел определить стиль моего пустого представления в XML. Это чище, и я мог бы использовать пользовательский макет, хотя теперь он допускает только одну строку.

Казалось, что он полагался на макет списка расписаний по умолчанию (поскольку я не мог найти inflate кода фрагмента), который содержит пустой текстовый вид, индикатор прогресса и т. Д. Я попытался предоставить свой собственный макет; Вот мой XML:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@android:id/empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="No items to show."/> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent"></ListView> </LinearLayout> 

И теперь я переопределяю onCreateView в своем CustomListFragment :

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

Я удалил часть кода, которую я написал выше, из onActivityCreated .

Теперь я получаю сбой, потому что ListFragment имеет значение null. Первоначально он установлен в ensureList() :

 mProgressContainer = root.findViewById(INTERNAL_PROGRESS_CONTAINER_ID); 

Должен ли я определять элемент управления «Контейнер прогресса» в моем настраиваемом макете? Мне кажется, что это неправильный подход, так как мне нужно указать id присвоенный INTERNAL_PROGRESS_CONTAINER_ID .

Каков рекомендуемый способ предоставления пользовательского XML-представления для пустой текстовой ситуации?

Документация для onCreateView () в ListFragment:

Если вы переопределяете этот метод своим собственным контентом, подумайте о включении стандартного макета list_content в ваш файл макета, чтобы вы продолжали сохранять все стандартное поведение ListFragment. В частности, в настоящее время это единственный способ показать состояние встроенного неопределенного прогресса.

Изучение источника этого ensureList() показывает, что если вы используете настраиваемое представление, это не просто соображение: похоже, что вы должны включить стандартный макет list_content , иначе он будет взорваться при поиске контейнера прогресса.

Однако, даже если вы включили:

  <include layout="@android:layout/list_content" /> 

В вашем XML, и вы определяете свой собственный пустой вид с идентификатором android.R.id.empty , у вас возникнет проблема с использованием вашего собственного пустого представления. Код в ensureList() предпочитает пустой вид по умолчанию для вашего собственного:

  mStandardEmptyView = (TextView)root.findViewById( com.android.internal.R.id.internalEmpty); if (mStandardEmptyView == null) { mEmptyView = root.findViewById(android.R.id.empty); } else { mStandardEmptyView.setVisibility(View.GONE); } 

Я также попытался установить пустой вид непосредственно в моем представлении списка, то есть:

 getListView().setEmptyView(myCustomEmptyView) 

Но у этого тоже были проблемы, поскольку фрагмент списка не знает, чтобы скрыть пустой вид, когда он показывает встроенный контейнер выполнения.

Я пришел к выводу, что если вы хотите определить свой собственный пустой вид, вы не сможете воспользоваться встроенным поведением или методами setListAdapter() такими как setListAdapter() и setListShown() , и вам необходимо управлять видимостью контейнера прогресса И пустое представление.

Вам нужно использовать setEmptyView, а не setEmptyText.

Этот связанный вопрос и ответ показывает, как использовать настраиваемое представление, которое вы можете установить с помощью setEmptyView https://stackoverflow.com/a/15990955/443900

Резюме состоит в том, чтобы сделать что-то вроде:

 // if you're using a ListFragment // do this inside onActivityCreated View emptyView = getActivity().getLayoutInflater().inflate(R.layout.empty_view, null); ((ViewGroup)getListView().getParent()).addView(emptyView); getListView().setEmptyView(emptyView);