Використовуємо стандартні елементи 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 (або можна встановити фрагмент програмно)
<fragment
android:name="**.*******.********.MyListFragment"
android:layout_width="match_parent"
android:layout_height="match_parent">
</fragment>


Запускаємо додаток, переходимо до нашого 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 методи.
* Не вийде змінити анімацію через кастомний розмітку.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.