Фоновая Загрузка Списков

При загрузке больших списков из медленного источника (например, HTTP-запроса) нет смысла загружать весь список сразу, особенно если пользователю понадобится лишь небольшой объем данных (результаты поиска, новостные статьи).

В этом случае целесообразно реализовать постраничную загрузку списка.

В этой статье показан простой метод с использованием вид нижнего колонтитула контроль Посмотреть список .

Предполагается, что у нас уже есть список и его адаптер, который загружает элементы (даже первые несколько или все) с помощью, например, асинхронного HTTP-запроса.

Запрос данных удобнее вынести в отдельный класс, в который можно добавить возможность загрузки следующей страницы.



План Действий

  1. Подготовка макета элемента сообщения о процессе загрузки
  2. Подготовка контроля Посмотреть список
  3. Добавьте код, чтобы начать загрузку следующей страницы в адаптер списка.

  4. Обработка результата загрузки следующей страницы


Подготовка макета элемента сообщения о процессе загрузки

Создать макет XML с двумя элементами Индикатор с установленным флагом неопределенныйТолько И Текстовое представление с текстом «Загрузка.

».

Мы размещаем их в горизонтальном LinearLayout. Также можно использовать готовый макет пустого списка для информации о первоначальной загрузке.



Подготовка ListView

Мы загружаем подготовленный макет и устанавливаем его в качестве нижнего колонтитула для нашего ListView. Это необходимо сделать до вызова метода setAdapter. Не забудьте сохранить ссылку на элемент, чтобы можно было удалить его, когда достигнете конца списка.

  
  
  
   

private LinearLayout mLoadingFooter; @Override protected void onCreate(Bundle savedInstanceState) { .

LayoutInflater layoutInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mLoadingFooter = (LinearLayout) layoutInflater.inflate(R.layout.loading, null); mList = (ListView) findViewById(R.id.list); mList.addFooterView(mLoadingFooter); .

}



Добавьте код, чтобы начать загрузку следующей страницы в адаптер списка.

Чтобы начать загрузку следующей страницы, мы используем метод получить просмотр адаптер списка: если запрошен последний элемент списка, значит пора загрузить следующую страницу.

Удобно вынести процесс загрузки в отдельный поток и потом кинуть Intent в текущую активность.

Давай не забудем позвонить уведомитьDataSetInvalidated если во время загрузки данные, к которым обращается адаптер, изменятся.



@Override public View getView(int position, View convertView, ViewGroup parent) { .

if (position == getCount() - 1 && hasNextPage()) { loadNextPage(); } }

УПД: Гришкаа рекомендуется более правильный способ использования AbsListView.OnScrollListener :

mList.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView arg0, int arg1) {} @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (visibleItemCount > 0 && firstVisibleItem + visibleItemCount == totalItemCount && hasNextPage()) { loadNextPage(); } } });



Обработка результата загрузки следующей страницы

Намерение может быть перехвачено анонимно Широковещательный приемник и перенести в Обработчик (выполняется в потоке пользовательского интерфейса).

Все, что нам нужно сделать, это вызвать метод уведомитьDataSetChanged адаптер и удалите элемент нижнего колонтитула, если загружена последняя страница.



if (!hasNextPage() && mList.getFooterViewsCount() > 0) { mList.removeFooterView(mLoadingFooter); } mAdapter.notifyDataSetChanged();

Теги: #Android #Android #разработка #разработка #разработка для Android #разработка для Android #разработка для Android

Вместе с данным постом часто просматривают: