From 131e65fbe421e52b67845cff5335b15295328591 Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 29 Aug 2013 16:30:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B2=D1=81=D0=BF=D0=BE=D0=BC=D0=B0=D0=B3=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=81=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B1=D0=B5=D1=81=D0=BA=D0=BE=D0=BD=D0=B5?= =?UTF-8?q?=D1=87=D0=BD=D1=8B=D1=85=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/fragments/MailFragment.java | 68 +++------- .../annimon/client/utils/MoreListHelper.java | 123 ++++++++++++++++++ 2 files changed, 138 insertions(+), 53 deletions(-) create mode 100644 src/com/annimon/client/utils/MoreListHelper.java diff --git a/src/com/annimon/client/fragments/MailFragment.java b/src/com/annimon/client/fragments/MailFragment.java index ae80a0b..3ef84fb 100644 --- a/src/com/annimon/client/fragments/MailFragment.java +++ b/src/com/annimon/client/fragments/MailFragment.java @@ -2,72 +2,34 @@ package com.annimon.client.fragments; import android.app.ListFragment; import android.os.Bundle; -import android.widget.AbsListView; import android.widget.ArrayAdapter; -import android.widget.TextView; + +import com.annimon.client.utils.MoreListHelper; import java.util.ArrayList; public class MailFragment extends ListFragment { - private int itemsPerPage = 10; - private boolean loadingMore = false; - private ArrayList items; - private ArrayAdapter adapter; + private MoreListHelper moreListHelper; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - items = new ArrayList(); - adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, items); - - // FooterView для показа информации о подгрузке данных - TextView footerView = new TextView(getActivity()); - footerView.setText("Loading..."); - getListView().addFooterView(footerView); - - setListAdapter(adapter); - getListView().setOnScrollListener(new AbsListView.OnScrollListener(){ + moreListHelper = new MoreListHelper(getActivity(), getListView()) { @Override - public void onScrollStateChanged(AbsListView view, int scrollState) {} - @Override - public void onScroll(AbsListView view, int firstVisibleItem, - int visibleItemCount, int totalItemCount) { - int lastInScreen = firstVisibleItem + visibleItemCount; - if((lastInScreen == totalItemCount) && !(loadingMore)){ - Thread thread = new Thread(loadMoreListItems); - thread.start(); + public void onLoadItems(ArrayList items, int itemsPerPage) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) {} + for (int i = 0; i < itemsPerPage; i++) { + items.add(String.valueOf(System.currentTimeMillis())); } } - }); - Thread thread = new Thread(loadMoreListItems); - thread.start(); + }; + moreListHelper.setItemsPerPage(15); + moreListHelper.createAdapter(android.R.layout.simple_list_item_1); + setListAdapter(moreListHelper.getAdapter()); + moreListHelper.loadItems(); } - - private Runnable loadMoreListItems = new Runnable() { - @Override - public void run() { - loadingMore = true; - items = new ArrayList(); - try { - Thread.sleep(1000); - } catch (InterruptedException e) {} - for (int i = 0; i < itemsPerPage; i++) { - items.add(String.valueOf(System.currentTimeMillis())); - } - getActivity().runOnUiThread(returnRes); - } - }; - - private Runnable returnRes = new Runnable() { - @Override - public void run() { - if(items != null && items.size() > 0){ - adapter.addAll(items); - } - adapter.notifyDataSetChanged(); - loadingMore = false; - } - }; } diff --git a/src/com/annimon/client/utils/MoreListHelper.java b/src/com/annimon/client/utils/MoreListHelper.java new file mode 100644 index 0000000..570f8a5 --- /dev/null +++ b/src/com/annimon/client/utils/MoreListHelper.java @@ -0,0 +1,123 @@ +package com.annimon.client.utils; + +import android.app.Activity; +import android.view.View; +import android.widget.AbsListView; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.TextView; + +import java.util.ArrayList; + +/** + * Вспомагательный класс для создания подгружаемых списков. + * + * @author aNNiMON + */ +public abstract class MoreListHelper { + + private int itemsPerPage; + + private Activity activity; + private ArrayList items; + private ArrayAdapter adapter; + + private boolean loadingMore; + + public MoreListHelper(Activity activity, ListView listView) { + this(activity, listView, null); + } + + public MoreListHelper(Activity activity, ListView listView, View footerView) { + itemsPerPage = 10; + + this.activity = activity; + + if (footerView == null) { + // Создаём footer по умочанию. + footerView = new TextView(activity); + ((TextView) footerView).setText("Loading..."); + } + + loadingMore = false; + items = new ArrayList(); + + listView.addFooterView(footerView); + listView.setOnScrollListener(scrollListener); + } + + /** + * Создаёт новый адаптер из ресурса разметки. + * @param layoutResource ресурс разметки + */ + public void createAdapter(int layoutResource) { + adapter = new ArrayAdapter(activity, layoutResource, items); + } + + public ArrayAdapter getAdapter() { + return adapter; + } + + public void setAdapter(ArrayAdapter adapter) { + this.adapter = adapter; + } + + /** + * Задаёт количество элементов на страницу. + * Используется при загрузке новых элементов для ограничения загружаемых данных. + * @param value количество элементов + */ + public void setItemsPerPage(int value) { + itemsPerPage = value; + } + + public void loadItems() { + Thread thread = new Thread(loadMoreListItemsRunnable); + thread.start(); + } + + private AbsListView.OnScrollListener scrollListener = new AbsListView.OnScrollListener() { + + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) {} + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + int lastInScreen = firstVisibleItem + visibleItemCount; + if ( (lastInScreen == totalItemCount) && !loadingMore ){ + loadItems(); + } + } + }; + + /** + * Метод загрузки новых элементов списка. + * Выполняется в отдельном треде. + * @param items список для заполнения + * @param itemsPerPage количество элементов на страницу (по умолчанию 10) + */ + public abstract void onLoadItems(ArrayList items, int itemsPerPage); + + private Runnable loadMoreListItemsRunnable = new Runnable() { + @Override + public void run() { + loadingMore = true; + items = new ArrayList(); + // Загружаем данные. + onLoadItems(items, itemsPerPage); + // Обновляем список и адаптер. + activity.runOnUiThread(updateAdapterRunnable); + } + }; + + private Runnable updateAdapterRunnable = new Runnable() { + @Override + public void run() { + if ( (items != null) && (items.size() > 0) ){ + adapter.addAll(items); + } + adapter.notifyDataSetChanged(); + loadingMore = false; + } + }; +}