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

от
Android    listview, adapterview

Динамическая подгрузка списка может быть полезной в тех случаях, когда данных очень много, но пользователю может быть полезна не вся информация, а лишь её начальная часть. Примером может служить новостная лента: чтобы не грузить полный список новостей за день, грузятся сначала недавние новости, а потом, по мере прокручивания списка, подгружается более старая информация. По такому способу можно сделать и загрузку твитов, RSS-ленты, почты и так далее.

+ Плюсы:
* Повышается производительность и скорость работы, так как грузится не вся информация, а лишь некоторая её часть.
* Пользователю не нужно лишний раз нажимать на какие-либо кнопки (как это может быть в постраничной навигации) - всё делается автоматически при скроллинге.

- Минусы:
* Невозможно заранее узнать, сколько всего элементов в списке.
* Если необходимо посмотреть последние элементы - придётся очень долго листать и подгружать список.

Несмотря на все минусы, большинство популярных приложений, используют динамическую подгрузку списка. Среди них: Gmail, ВКонтакте, клиенты Twitter'а и другие.

Для быстрого создания такого списка, можно воспользоваться классом MoreListHelper.java
Пример использования:
  1. public class ExampleActivity extends ListActivity implements AdapterView.OnItemClickListener {
  2.  
  3.     private MoreListHelper<String> moreListHelper;
  4.  
  5.     @Override
  6.     protected void onCreate(Bundle savedInstanceState) {
  7.         super.onCreate(savedInstanceState);
  8.  
  9.         moreListHelper = new MoreListHelper<String>(this, getListView()) {
  10.             @Override
  11.             public void onLoadItems(ArrayList<String> items, int itemsPerPage) {
  12.                 // Метод подгрузки выполняется в отдельном потоке.
  13.                 try {
  14.                     // Имитируем тяжелую загрузку.
  15.                     Thread.sleep(2000);
  16.                 } catch (InterruptedException e) {}
  17.                 for (int i = 0; i < itemsPerPage; i++) {
  18.                     items.add(String.valueOf(System.currentTimeMillis()));
  19.                 }
  20.             }
  21.         };
  22.         moreListHelper.setItemsPerPage(15);
  23.         moreListHelper.createAdapter(android.R.layout.simple_list_item_1);
  24.         setListAdapter(moreListHelper.getAdapter());
  25.         moreListHelper.loadItems();
  26.  
  27.         getListView().setOnItemClickListener(this);
  28.     }
  29.  
  30.     @Override
  31.     public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
  32.         // Работаем с данными
  33.     }
  34. }

* Метод onLoadItems выполняется в отдельном потоке, поэтому можно смело ставить туда тяжеловесные операции, такие как загрузка данных из Интернета или из файла.
* Указание количества элементов на страницу setItemsPerPage(..) ни на что не влияет и сделано для удобства. То значение, которое указывается передаётся как параметр методу onLoadItems. Если у вас другие планы касательно количества загрузки элементов, можете игнорировать это значение.
* В примере создаётся новый адаптер, но можно воспользоваться и своим, для этого следует передать ссылку на него: moreListHelper.setAdapter(yourCustomAdapter);
* В примере используется адаптер для данных типа String, но MoreListHelper позволяет работать с любым другим типом данных.
* Если не передать свой View в качестве отображаемого при загрузке, то будет создан обычный TextView с оповещением о загрузке.

Вот как всё это выглядит
morelisthelper.png
  • +8
  • views 6658