Friday, December 28, 2012

ListView и динамическая подгрузка данных

Cтатья рассчитана на начальный уровень. Бывалый разработчик не найдет здесь ничего интересного :)

Рассмотрим такую ситуацию. У нас есть приложение, которое представляет данные в виде списка ListView. Т.к. в нек. момент времени на экране отображается лишь определенное количество элементов, возникает вопрос: как подгружать данные в конец списка во время прокрутки(вопрос об источнике данных сейчас не стоит - это может быть сервис или локальная БД)? Казалось бы тривиальная вещь, но у тех кто только осваиват Android платформу он вызывает нек. затруднения. Итак начнем.

Создадим активити и отнаследуем его от ListActivity. Внутри нашего класса определим два компонента. Первый StringAdapter - класс отвечающий за отрисовку элементов списка.

Обращаю внимание, что в реальном приложении следует использованием ViewHolder, но т.к. проект учебный, то можем позволить себе нек. упрощения. ArrayAdapter оборачивает String. data,как подсказывает нам кэп очевидность, - это коллекция с данными.

Второй компонент - это класс реализующий AsyncTask. Подгруздка данных будет осуществляться в фоновом режиме. В методе doInBackground просто генерируем 20-ть строк и добавляем их в коллекцию. В реальном приложении - это то место где должна происходить непосредственная загрузка данных(строка Thread.sleep(1000); служит для эмуляции задержки сети, чтения из БД и т.д.). По завершению задачи, будет вызван метод onPostExecute. В нем мы отдаем данные адаптеру и уведомляем его об изменениях.

И последний шаг. В тот момент когда был достигнут конец списка, необходимо запустить задачу подгрузки данных. Для этих целей нужно добавить интерфейс OnScrollListener в активити класс и реализовать метод onScroll:

Алгоритм простой. Если последний элемент был отображен и в данный момент времени нет активной задачи, то запускаем подгрузку данных. Теперь небольшое видео, как это работает:

Демо проект можно скачать с github-а.

1 comment:

  1. У меня проблема с внедрением

    ReplyDelete