package com.likebamboo.osa.android.ui; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.view.LayoutInflater; import android.widget.AbsListView; import com.android.volley.Response; import com.android.volley.VolleyError; import com.likebamboo.osa.android.R; import com.likebamboo.osa.android.entity.BaseRsp; import com.likebamboo.osa.android.exception.ErrorTrans; import com.likebamboo.osa.android.exception.OsaException; import com.likebamboo.osa.android.request.RequestManager; import com.likebamboo.osa.android.request.RequestParams; import com.likebamboo.osa.android.ui.adapter.BaseAdapter; import com.likebamboo.osa.android.ui.view.LoadingLayout; import butterknife.ButterKnife; import butterknife.InjectView; /** * 分页加载数据Activity基类 * Created by likebamboo on 2015/5/14. */ public abstract class EndlessActivity<T extends BaseRsp> extends NavigationActivity implements AbsListView.OnScrollListener, SwipeRefreshLayout.OnRefreshListener { /** * pageSize , 默认值 20 */ public static final int PAGE_SIZE = 20; /** * 参数, pageSize , 默认值 20 */ public static final String PARAM_PAGE_SIZE = "pageSize"; /** * 参数,pageNo */ public static final String PARAM_PAGE_NO = "pageNo"; /** * 适配器 */ protected BaseAdapter mAdapter = null; /** * footer */ protected LoadingLayout mFooterView = null; /** * loading */ @InjectView(android.R.id.empty) protected LoadingLayout mLoadingLayout = null; /** * 页码 */ protected int mPageIndex = 0; /** * 页容量 */ protected int mPageSize = PAGE_SIZE; /** * 是否还有更多 */ protected boolean mHasMore = true; /** * 是否正在加载数据 */ protected boolean isLoading = false; /** * 是否正在下拉刷新数据 */ protected boolean isRefreshing = false; /** * 下拉刷新控件 */ protected SwipeRefreshLayout mSwipeRefreshLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getLayoutId()); ButterKnife.inject(this); // 添加footer mFooterView = (LoadingLayout) LayoutInflater.from(this).inflate(R.layout.footer_loading_layout, null); // 重试 mLoadingLayout.setRetryListener(new LoadingLayout.IRetryListener() { @Override public void onRetry() { reloadDatas(); } }); mFooterView.setRetryListener(new LoadingLayout.IRetryListener() { @Override public void onRetry() { mFooterView.showLoading(true); reloadDatas(); } }); // 下拉刷新 try { mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh); mSwipeRefreshLayout.setOnRefreshListener(this); } catch (Exception e) { // ignore } } @Override public final void setContentView(int layoutId) { super.setContentView(layoutId); } /** * 重试 */ public void reloadDatas() { if (mPageIndex == 0) { // 显示加载中的布局 mLoadingLayout.showLoading(true); } // 加载数据 loadDatas(); } /** * 网络请求出错时回调 * * @return */ protected final Response.ErrorListener errorListener() { return new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { isLoading = false; doOnError(ErrorTrans.transToOsaException(error)); } }; } /** * 加载数据成功时回调 * * @return */ protected final Response.Listener<T> responseListener() { return new Response.Listener<T>() { @Override public void onResponse(T data) { isLoading = false; mLoadingLayout.showLoading(false); // 如果是刷新数据 if (isRefreshing) { // 清空现有数据 reset(); // 停止刷新 stopRefresh(); } doOnSuccess(data); } }; } @Override public void onScrollStateChanged(final AbsListView view, final int scrollState) { } @Override public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) { // our handling int lastInScreen = firstVisibleItem + visibleItemCount; if (lastInScreen >= totalItemCount && mAdapter != null && !mAdapter.isEmpty()) { // 加载更多数据。 loadDatas(); } } @Override protected void onDestroy() { super.onDestroy(); // 取消请求 RequestManager.cancelAll(this.getClass().getName()); isLoading = false; } /** * 加载数据 */ protected final void loadDatas() { // 如果正在加载数据,或者没有更多数据了, if (isLoading) { return; } if (!mHasMore) { mFooterView.showEmpty(getString(R.string.has_not_more_data)); return; } isLoading = true; if (mPageIndex > 0) { mFooterView.showLoading(true); } else { mLoadingLayout.showLoading(true); } // 加载数据 RequestParams params = new RequestParams(); params.add(PARAM_PAGE_NO, (mPageIndex + 1) + "").add(PARAM_PAGE_SIZE, "" + mPageSize); loadDatas(params); } @Override public void onRefresh() { // 如果正在加载数据,不刷新 if (isLoading) { // stop refresh stopRefresh(); return; } isRefreshing = true; // 加载数据 RequestParams params = new RequestParams(); params.add(PARAM_PAGE_NO, 1 + "").add(PARAM_PAGE_SIZE, "" + mPageSize); loadDatas(params); } /** * 加载失败,显示错误信息 * * @param error */ protected void doOnError(OsaException error) { // 如果加载第一页的数据出错,显示错误信息 if (mPageIndex == 0) { mLoadingLayout.showError(error.getMessage() + "\n" + getString(R.string.retry)); mFooterView.showLoading(false); return; } mFooterView.showError(error.getMessage() + "\n" + getString(R.string.retry)); } /** * 显示服务器返回的信息 * * @param data */ protected void showMessage(T data) { // 如果加载第一页的数据为空 if (mPageIndex == 0) { mLoadingLayout.showEmpty(data == null ? getString(R.string.can_not_find_data) : data.getMessage()); } else { mFooterView.showEmpty(getString(R.string.has_not_more_data)); } } /** * 重置 */ protected void reset() { // 清空现有数据 if (mAdapter != null) { mAdapter.clear(); } isLoading = false; mHasMore = true; mPageIndex = 0; } /** * stopRefresh */ protected void stopRefresh() { isRefreshing = false; if (mSwipeRefreshLayout != null) { mSwipeRefreshLayout.setRefreshing(false); } } protected abstract void loadDatas(RequestParams params); /** * 加载数据成功回调 */ protected abstract void doOnSuccess(T data); /** * layoutId */ protected abstract int getLayoutId(); }