Используем стандартные элементы ListFragment по назначению

в 10:44, , рубрики: fragments, fragments api, Разработка под android

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

ListFragment предназначен для отображения списков и примечателен тем, что его можно использовать без XML-разметки, при этом он уже имеет минимальный набор представлений, а код самого класса благодаря этому, становится намного проще, чем стандартный Fragment.

Прежде, чем работать с ListFragment, давайте изучим, из чего он состоит.

Если зайти в исходники класса ListFragment, мы увидим:

final private AdapterView.OnItemClickListener mOnClickListener // слушатель клика на элемент списка
ListAdapter mAdapter; // адаптер списка
ListView mList; // представление списка
View mEmptyView; // используется android.R.id.empty, в случае если mStandardEmptyView==null
TextView mStandardEmptyView; // текстовое представления для отображения "Ничего не найдено" (можно установить свой текст)
View mProgressContainer; // троббер показывающий процесс загрузки контента
View mListContainer; // родительский элемент

Создадим наш класс:

import android.support.v4.app.ListFragment; // или android.app.ListFragment;

public class MyListFragment extends ListFragment{
}

И включим его в разметку Activity:

<fragment
        android:name="ru.*******.********.MyListFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </fragment>

Запускаем приложение, переходим к нашему Activity и видим троббер (пользователь ждет загрузки контента):

image

Теперь, для того, чтобы нам прогрузить список, достаточно передать в наш фрагмент объект списка (я использовал OttoBus событие, но вариаций может быть много).

<source lang="
Subscribe
public void onMyEvent(MyEvent loaderEvent) throws InterruptedException {
String[] listItems = {«item 1», «item 2», «item 3»,«item 4»}; // пример списка
Thread.sleep(2000); // имитация времени загрузки
ArrayAdapter mArrayAdapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, listItems); // адаптер списка
setListAdapter(mArrayAdapter); // установка адаптера
}

Снова открываем приложение и видим сначала анимацию, затем список:

image

А если у нас listItems == null, получим другой экран:

image

Этот стандартный текст можно поменять на свой:

setEmptyText(getResources().getString(R.string.error));

Обработка нажатий списка:

@Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // ваш ход господа
    }

Итого:

Плюсы:
* Не нужна XML разметка для фрагмента;
* Никаких ListView, ProgressBar, EmptyText;
* Мало кода в классе фрагмента.

Минусы:
* Нельзя добавить свое представление;
* Сложнее менять стили;
* Прочие минусы кастомизации (такое решение подойдет для простых списков, без Refresh, подгрузок и прочего...).

Автор: atetc

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js