上一篇我们讲到了, Http Json的功能的抽取. 如果我们请求的是一个列表的数据呢?
我们使用那个功能就不是很好. 因为一个列表, 还有很多其他功能(比如每个listView都需要setAdapter, notifyDataSetChanged等操作,但是我们没必要在每个Activity都去做这样的操作, 直接交给父类处理即可,子类只管发送请求就行了), 所以这样重新定义了一个类, 供列表类型的Activity使用(BaseListFragment) .
1, 列表类型的Activity功能介绍 ,
①现在很多是把最新的数据加载到listView的最前面, 俗称下拉刷新 .
②但是还有另一类listView就是把最新的时候放在最后, 也就是 :上拉加载更多(最新)
总结来说就是一个降序,一个是升序. 各有的应用场景, 大部分适合第一种, 特别是经常更新的数据. 但是比如第二种就适合"课程"的列表, 用户总希望是从第1课往后排, 而不是第一课在最后面.
在父类定义一个布尔类型的变量即可:
/** 是否是升序 */ protected boolean ascending = false;
如果是升序, 则是第二种情况, 把下拉刷新的功能禁止即可.
2, 总体和上一篇文章的架构是类似的. 只是在父类的判断多了, 因为操作类型多了.
Http Json的功能模型在List Http Json里也是需要的, 所以回调接口在自己已有方法的基础上还继承了Http Json的回调接口ISingleCallback
下面是回调接口:
public interface <strong>IListCallback</strong><T> extends <strong>ISingleCallback </strong>{ /** * 当listView到达最后 */ public void onReachLast(); /** * 刷新 */ public void onRefresh(); /** * 解析json * * @param json * @return */ public List<T> parseJson(String json); /** * 获取最新数据 */ public void sendLastestDataRequest(HttpParam params); /** * 根据id获取最新数据 * * @param id */ public void sendRefreshRequest(HttpParam params); /** * 加载更多 */ public void sendLoadMoreRequest(HttpParam params); }
3, 下面是核心代码 :
private void <strong>baseListRequest</strong>(final int key, final HttpParam params) { params.setUrl(listUrl); final int symbol = params.getInt(Constant.SYMBOL); if (TaskController.getInstance().exist(key)) { ToastUtil.showShortToast(getActivity(), R.string.task_executing); return; } new TaskHttp(key, new HttpCallback() { @Override public Object shouldExecute(HttpParam params) { return searchCache(key, params); } @Override public Object handleJsonData(String json) { if (StringUtil.isEmpty(json)) { return null; } try { return parseJson(json); } catch (Exception e) { e.printStackTrace(); } return null; } @SuppressWarnings("unchecked") @Override public void onFinalResult(Object content) { finishPullOrUp(); if (content != null) { if (content instanceof List) { List<T> tmp = (List<T>) content; if (ascending) { list.addAll(tmp); } else { // 下拉刷新 if (symbol == Constant.SYMBOL_PULL_REFRESH) { list.addAll(0, tmp); checkResultCount(params, tmp); } else {// 加载更多 list.addAll(tmp); } if (symbol == Constant.SYMBOL_LASTEST_DATA) { checkResultCount(params, tmp); } } if (adapter != null){ adapter.notifyDataSetChanged(); } } else if (content instanceof String) { ToastUtil.showLongToast(getActivity(), content.toString()); } } else { if (symbol == Constant.SYMBOL_LOAD_MORE) { isLast = true; } } if (isLast) { mPullListView.setHasMoreData(false); } } @Override public void onFailed(int type, String msg) { finishPullOrUp(); if (LogUtil.DEVELOP_MODE) LogUtil.error(TAG, msg); FragmentActivity activity = getActivity(); if (activity != null) { ToastUtil.showShortToast(activity, msg); } mPullListView.errLoaded(); } private void finishPullOrUp() { switch (symbol) { case Constant.SYMBOL_LASTEST_DATA: case Constant.SYMBOL_PULL_REFRESH: mPullListView.onPullDownRefreshComplete(); setLastUpdateTime(); break; case Constant.SYMBOL_LOAD_MORE: mPullListView.onPullUpRefreshComplete(); break; } } private void checkResultCount(final HttpParam params, List<T> tmp) { if (params.getInt(Constant.MAX_RECORD) > tmp.size()) { mPullListView.setHasMoreData(false); isLast = true; } } }).execute(params); } public List<T> parseJson(String json) { return null; } /** * 获取列表数据 * * @param param * 1:taskFlag,2:firstIndex,3:symbol */ <strong>private </strong>void <strong>sendListRequest</strong>(int key, HttpParam params) { int symbol = params.getInt(Constant.SYMBOL); switch (symbol) { case Constant.SYMBOL_PULL_REFRESH: params.addParam(Constant.MAX_RECORD, Integer.MAX_VALUE); break; case Constant.SYMBOL_LASTEST_DATA: case Constant.SYMBOL_LOAD_MORE: params.addParam(Constant.MAX_RECORD, Constant.RECORD_COUNT); if (ascending) { params.addParam(Constant.ASCENDING, "1"); } break; } baseListRequest(key, params); } public void <strong>sendLoadMoreRequest</strong>(HttpParam params) { params.addParam(Constant.ACTION, "list").addParam(Constant.SYMBOL, Constant.SYMBOL_LOAD_MORE); sendListRequest(flagTaskLoadMore, params); } @Override public void <strong>sendLastestDataRequest</strong>(HttpParam params) { params.addParam(Constant.ACTION, "lastest").addParam(Constant.SYMBOL, Constant.SYMBOL_LASTEST_DATA); sendListRequest(flagTaskDefault, params); } @Override public void <strong>sendRefreshRequest</strong>(HttpParam params) { params.addParam(Constant.ACTION, "list").addParam(Constant.SYMBOL, Constant.SYMBOL_PULL_REFRESH); sendListRequest(flagTaskRefresh, params); }
这样也就完成了. 在子类那就很方便了, 只需要做请求就可以了, 界面的渲染都不要做了, 父类全做好了.