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

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

Прежде, чем начать работать с ListFragment, давайте немного изучим, что же находится внутри? По умолчанию используется разметка из ~\sdk\platforms\android-XX\data\res\layout\list-content.xmlУ некоторых представлений этой разметки имеются идентификаторы, благодаря которым мы можем кастомизировать родительский контейнер, список и текст пустого списка.

Если пробежаться по исходникам класса ListFragment, мы увидим:

View mListContainer; // родительский контейнер (идентификатор R.id.listContainer) final private AdapterView.OnItemClickListener mOnClickListener // «слушатель» клика на элемент списка ListAdapter mAdapter; // адаптер списка ListView mList; // представление списка (идентификатор android.R.id.list) TextView mEmptyView; // текстовое представление для случая пустого списка (идентификатор android.R.id.empty) View mProgressContainer; // представление для анимации загрузки Итак, создадим наш класс: import android.app.ListFragment;

public class MyListFragment extends ListFragment{ } И включим его в разметку нашего Activity (либо можно установить фрагмент программно) Запускаем приложение, переходим к нашему Activity и сразу же видим анимацию загрузки:

image

После окончания загрузки, нам необходимо установить ваш адаптер вызвав метод setAdapter (ListAdapter adapter) (я использовал OttoBus событие, но вариантов может быть много).

@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

А если наш список вдруг окажется пустым, то получим другой экран:

image

Для установки своего текста для пустого списка используется метод:

setEmptyText (getResources ().getString (R.string.error)); Также в классе ListFragment имеется метод обработки нажатий списка, который мы можем

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

Плюсы:* Можно совсем не делать XML-разметку.* Нет необходимости объявлять представления.* Не нужно прописывать логику для анимации, она уже из коробки.* Меньше кода.

Минусы:* Нужно немного изучить встроенные в ListView методы.* Не получится кастомизировать анимацию и подпись к ней через кастомную разметку.

© Habrahabr.ru