[Из песочницы] Используем стандартные элементы 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 (либо можно установить фрагмент программно)
После окончания загрузки, нам необходимо установить ваш адаптер вызвав метод 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); // установка адаптера }
Сразу после установки адаптера анимация исчезнет и мы увидим либо:
А если наш список вдруг окажется пустым, то получим другой экран:
Для установки своего текста для пустого списка используется метод:
setEmptyText (getResources ().getString (R.string.error)); Также в классе ListFragment имеется метод обработки нажатий списка, который мы можем
@Override public void onListItemClick (ListView l, View v, int position, long id) { // ваш ход господа } Итого:
Плюсы:* Можно совсем не делать XML-разметку.* Нет необходимости объявлять представления.* Не нужно прописывать логику для анимации, она уже из коробки.* Меньше кода.
Минусы:* Нужно немного изучить встроенные в ListView методы.* Не получится кастомизировать анимацию и подпись к ней через кастомную разметку.