package org.aisen.wen.ui.fragment; import android.os.Bundle; import android.view.ViewGroup; import org.aisen.wen.component.network.biz.IResult; import org.aisen.wen.component.network.task.TaskException; import org.aisen.wen.support.paging.IPaging; import org.aisen.wen.ui.adapter.IPagingAdapter; import org.aisen.wen.ui.model.IPagingModel; import org.aisen.wen.ui.model.listener.IModelListener; import org.aisen.wen.ui.model.listener.ModelListenerParam; import org.aisen.wen.ui.model.listener.PagingModelListenerParam; import org.aisen.wen.ui.presenter.IPagingPresenter; import org.aisen.wen.ui.view.IPaingView; import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * Created by wangdan on 16/10/14. */ public abstract class APagingPresenterFragment<Item extends Serializable, Result extends Serializable, Header extends Serializable, RefreshView extends ViewGroup, ContentMode extends IPagingModel<Item, Result>, ContentView extends IPaingView<Item, Result, Header, RefreshView>> extends APresenterFragment<Result, ContentMode, ContentView> implements IPagingPresenter<Item, Result, Header, RefreshView, ContentMode, ContentView>, IModelListener<Result>, IPaingView.IPagingViewCallback{ private static final String SAVED_PAGING = "org.aisen.android.ui.Paging"; private IPaging<Item, Result> mPaging;// 分页器 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getPView().setPagingViewCallback(this); if (savedInstanceState != null && savedInstanceState.getSerializable(SAVED_PAGING) != null) { mPaging = (IPaging) savedInstanceState.getSerializable(SAVED_PAGING); } else { mPaging = newPaging(); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // 将分页信息保存起来 if (mPaging != null) outState.putSerializable(SAVED_PAGING, mPaging); } @Override public void onPullDownToRefresh() { requestData(RefreshMode.refresh); } @Override public void onPullUpToRefresh() { requestData(RefreshMode.update); } @Override final public void requestData() { // 如果没有Loading视图,且数据为空,就显示FootView加载状态 RefreshMode mode = RefreshMode.reset; if (getPView().getAdapter().getDatas().size() == 0 && getPView().getLoadingLayout() == null) mode = RefreshMode.update; requestData(mode); } public void requestData(RefreshMode mode) { if (mode == RefreshMode.reset && mPaging != null) mPaging = newPaging(); getPModel().execute(mode, mPaging); } @Override public void requestDataOutofdate() { getPView().putLastReadPosition(0); getPView().putLastReadTop(0); requestDataSetRefreshing(); } /** * 设置刷新控件为刷新状态且刷新数据 * */ public void requestDataSetRefreshing() { // 如果没有正在刷新,设置刷新控件,且子类没有自动刷新 if (!getPModel().isRunning() && !getPView().setRefreshViewToLoading()) requestData(RefreshMode.reset); } @Override public void onSuccess(ModelListenerParam<Result> param) { if (param.getResult() == null) { super.onSuccess(param); return; } Result result = param.getResult(); RefreshMode mode = ((PagingModelListenerParam<Result>) param).getRefreshMode(); getPView().bindAdapter(getPView().getAdapter()); List<Item> resultList; if (result instanceof List) resultList = (List<Item>) result; else { resultList = getPModel().parseResult(result); if (resultList == null) resultList = new ArrayList<>(); } // 如果子类没有处理新获取的数据刷新UI,默认替换所有数据 if (!getPView().handleResult(mode, resultList, result)) { if (mode == RefreshMode.reset) { getPView().getAdapter().getDatas().clear(); getPView().getAdapter().getDatas().addAll(new ArrayList<Item>()); } } // append数据 if (mode == RefreshMode.reset || mode == RefreshMode.refresh) IPagingAdapter.Utils.addItemsAtFrontAndRefresh(getPView().getAdapter(), resultList); else if (mode == RefreshMode.update) IPagingAdapter.Utils.addItemsAndRefresh(getPView().getAdapter(), resultList); // 处理分页数据 if (mPaging != null) { if (getPView().getAdapter() != null && getPView().getAdapter().getDatas().size() != 0) mPaging.processData(result, (Item) getPView().getAdapter().getDatas().get(0), (Item) getPView().getAdapter().getDatas().get(getPView().getAdapter().getDatas().size() - 1)); else mPaging.processData(result, null, null); } // 如果是重置数据,重置canLoadMore if (mode == RefreshMode.reset) getPView().getRefreshConfig().pagingEnd = false; // 如果数据少于这个值,默认加载完了 if (mode == RefreshMode.update || mode == RefreshMode.reset) getPView().getRefreshConfig().pagingEnd = resultList.size() == 0; // 如果是缓存数据,且已经过期 if (result instanceof IResult) { // 这里增加一个自动刷新设置功能 IResult iResult = (IResult) result; if (iResult.fromCache() && !iResult.outofdate()) getPView().toLastReadPosition(); if (mode == RefreshMode.reset || mode == RefreshMode.update) { if (iResult.endPaging()) getPView().getRefreshConfig().pagingEnd = true; else getPView().getRefreshConfig().pagingEnd = false; } } if (mode == RefreshMode.reset && getTaskCount(getPModel().getTaskId()) > 1) getPView().getAdapter().notifyDataSetChanged(); getPView().setupRefreshViewWithConfig(getPView().getRefreshConfig()); super.onSuccess(param); } @Override public IPaging<Item, Result> newPaging() { return null; } @Override public IPaging<Item, Result> getPaging() { return mPaging; } @Override public void onTaskStateChanged(ModelListenerParam<Result> param) { super.onTaskStateChanged(param); RefreshMode mode = ((PagingModelListenerParam) param).getRefreshMode(); TaskState state = param.getTaskState(); TaskException exception = param.getException(); getPView().onTaskStateChanged((PagingModelListenerParam<Result>) param); if (state == TaskState.success) { if (getPView().isContentEmpty()) { getPView().setEmptyHind(getPView().getRefreshConfig().emptyHint); } } else if (state == TaskState.falid) { if (getPView().isContentEmpty()) { getPView().setFailureHint(exception.getMessage()); } } else if (state == TaskState.finished) { getPView().setRefreshViewFinished(mode); } } }