package cn.alphabets.light.ui; import android.app.Activity; import android.graphics.Color; import android.support.v4.widget.SwipeRefreshLayout; import android.view.Gravity; import android.view.View; import android.widget.AbsListView; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ProgressBar; import java.util.List; /** * 向上滑动ListView,加载更多内容 * Created by lin on 14/11/20. */ public class PaginationController { private ListView listView; private ArrayAdapter listAdapter; private View footerView; private SwipeRefreshLayout refresh; private Loader loader; private int total = 0; // 总数据件数 private int limit = 10; // 一次获取数据件数 private int start = 0; // 获取数据的起点 private boolean isLoading = false; // 是否正在从后台加载数据 /** * 加载数据的回调函数 */ public interface Loader { public void load(); } /** * 重置 */ public void reset() { this.total = 0; this.start = 0; this.isLoading = false; this.listAdapter.clear(); } /** * 更新数据之后,设定状态 * @param objects 数据一览 * @param total 所有件数 */ public void updateState(List objects, int total) { this.isLoading = false; this.start = this.start + objects.size(); this.total = total; this.listAdapter.addAll(objects); this.listAdapter.notifyDataSetChanged(); this.clearWait(); } /** * 清除等待动画,通常在出错处理里使用 */ public void clearWait() { try { this.listView.removeFooterView(this.footerView); } catch (ClassCastException e) { // android4.4以前的设备,会报错误,忽略错误 } if (this.refresh != null) { this.refresh.setRefreshing(false); } } /** * 初始化翻页 * @param listView view * @param listAdapter adapter */ public void initializePagination(Activity activity, ListView listView, ArrayAdapter listAdapter) { // 添加进度框 AbsListView.LayoutParams params = new AbsListView.LayoutParams( AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT); LinearLayout listRefresh = new LinearLayout(activity); listRefresh.setLayoutParams(params); listRefresh.setGravity(Gravity.CENTER); listRefresh.setOrientation(LinearLayout.VERTICAL); listRefresh.addView(new ProgressBar(activity, null, android.R.attr.progressBarStyle)); initializePagination(listView, listAdapter, listRefresh); } public void initializePagination(ListView listView, ArrayAdapter listAdapter, View footerView) { this.footerView = footerView; this.listAdapter = listAdapter; this.listView = listView; this.listView.setOnScrollListener(OnScrollListener); this.listView.setAdapter(this.listAdapter); } /** * 初始化下拉刷新 * @param refresh refresh */ public void initializePullRefresh(SwipeRefreshLayout refresh) { this.refresh = refresh; this.refresh.setOnRefreshListener(OnRefreshListener); this.refresh.setColorSchemeColors(Color.LTGRAY, Color.GRAY, Color.DKGRAY, Color.BLACK); } /** * 向下滑动追加获取数据 */ private ListView.OnScrollListener OnScrollListener = new ListView.OnScrollListener() { @Override public void onScrollStateChanged(android.widget.AbsListView absListView, int scrollState) { } @Override public void onScroll(android.widget.AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (!isLoading && totalItemCount == firstVisibleItem + visibleItemCount && totalItemCount < total) { isLoading = true; listView.addFooterView(footerView); loader.load(); } } }; /** * 下拉刷新,重新加载消息数据 */ private SwipeRefreshLayout.OnRefreshListener OnRefreshListener = new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { reset(); loader.load(); } }; public int getStart() { return start; } public void setStart(int start) { this.start = start; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public int getLimit() { return limit; } public void setLimit(int limit) { this.limit = limit; } public void setLoader(Loader loader) { this.loader = loader; } public Loader getLoader() { return loader; } }