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