Добавлен вспомагательный класс для создания бесконечных списков
This commit is contained in:
parent
3a419f0c3b
commit
131e65fbe4
@ -2,72 +2,34 @@ package com.annimon.client.fragments;
|
|||||||
|
|
||||||
import android.app.ListFragment;
|
import android.app.ListFragment;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.widget.AbsListView;
|
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
import android.widget.TextView;
|
|
||||||
|
import com.annimon.client.utils.MoreListHelper;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class MailFragment extends ListFragment {
|
public class MailFragment extends ListFragment {
|
||||||
|
|
||||||
private int itemsPerPage = 10;
|
private MoreListHelper<String> moreListHelper;
|
||||||
private boolean loadingMore = false;
|
|
||||||
private ArrayList<String> items;
|
|
||||||
private ArrayAdapter<String> adapter;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onActivityCreated(Bundle savedInstanceState) {
|
public void onActivityCreated(Bundle savedInstanceState) {
|
||||||
super.onActivityCreated(savedInstanceState);
|
super.onActivityCreated(savedInstanceState);
|
||||||
|
|
||||||
items = new ArrayList<String>();
|
moreListHelper = new MoreListHelper<String>(getActivity(), getListView()) {
|
||||||
adapter = new ArrayAdapter<String>(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(){
|
|
||||||
@Override
|
@Override
|
||||||
public void onScrollStateChanged(AbsListView view, int scrollState) {}
|
public void onLoadItems(ArrayList<String> items, int itemsPerPage) {
|
||||||
@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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Thread thread = new Thread(loadMoreListItems);
|
|
||||||
thread.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Runnable loadMoreListItems = new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
loadingMore = true;
|
|
||||||
items = new ArrayList<String>();
|
|
||||||
try {
|
try {
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
} catch (InterruptedException e) {}
|
} catch (InterruptedException e) {}
|
||||||
for (int i = 0; i < itemsPerPage; i++) {
|
for (int i = 0; i < itemsPerPage; i++) {
|
||||||
items.add(String.valueOf(System.currentTimeMillis()));
|
items.add(String.valueOf(System.currentTimeMillis()));
|
||||||
}
|
}
|
||||||
getActivity().runOnUiThread(returnRes);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
moreListHelper.setItemsPerPage(15);
|
||||||
private Runnable returnRes = new Runnable() {
|
moreListHelper.createAdapter(android.R.layout.simple_list_item_1);
|
||||||
@Override
|
setListAdapter(moreListHelper.getAdapter());
|
||||||
public void run() {
|
moreListHelper.loadItems();
|
||||||
if(items != null && items.size() > 0){
|
|
||||||
adapter.addAll(items);
|
|
||||||
}
|
}
|
||||||
adapter.notifyDataSetChanged();
|
|
||||||
loadingMore = false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
123
src/com/annimon/client/utils/MoreListHelper.java
Normal file
123
src/com/annimon/client/utils/MoreListHelper.java
Normal file
@ -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<T> {
|
||||||
|
|
||||||
|
private int itemsPerPage;
|
||||||
|
|
||||||
|
private Activity activity;
|
||||||
|
private ArrayList<T> items;
|
||||||
|
private ArrayAdapter<T> 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<T>();
|
||||||
|
|
||||||
|
listView.addFooterView(footerView);
|
||||||
|
listView.setOnScrollListener(scrollListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Создаёт новый адаптер из ресурса разметки.
|
||||||
|
* @param layoutResource ресурс разметки
|
||||||
|
*/
|
||||||
|
public void createAdapter(int layoutResource) {
|
||||||
|
adapter = new ArrayAdapter<T>(activity, layoutResource, items);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayAdapter<T> getAdapter() {
|
||||||
|
return adapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAdapter(ArrayAdapter<T> 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<T> items, int itemsPerPage);
|
||||||
|
|
||||||
|
private Runnable loadMoreListItemsRunnable = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
loadingMore = true;
|
||||||
|
items = new ArrayList<T>();
|
||||||
|
// Загружаем данные.
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user