Android项目-高考作文项目架构(三)
上一篇我们讲到了, 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); }
这样也就完成了. 在子类那就很方便了, 只需要做请求就可以了, 界面的渲染都不要做了, 父类全做好了.
Android项目-高考作文项目架构(三)的更多相关文章
- Android项目-高考作文项目架构(二)
1, 普通的http json请求 请看下面架构草图: 这样就抽象出了其他Activity可能需要的Http Json请求的功能. 只要其他Activity有Http Json请求的需求都可以继承Ba ...
- Android项目-高考作文功能简介(一)
前言 : 开发安卓也已2年多了近3年了, 在自己刚入行的时候就有自己独立开发一个App的想法. 后来自己做了<<高考作文>>这一App. 后面续续断断的维护者. 也因为功能简 ...
- Android项目-高考作文-使用ORMLite抽象公共的Dao层
1, 定义统一的Dao接口 public interface IDao<T> { public abstract T getSingleById(int id); public abstr ...
- Android项目-高考作文-抽象BaseAdapter
1, 在使用baseAdapter的时候,总是有需要重复的代码如: @Override public int getCount() { return list.size(); } @Override ...
- Android项目-高考作文-AsyncTask的不足
1, AsyncTask的不足. 从android4.0开始, 后台只允许一个AsyncTask执行, 如果当前的AsyncTask没有执行完毕, 那么当前的请求一直处于等待状态. 直到上一个执行完毕 ...
- ReadHub项目Kotlin版开发指南(三、MVP架构)
ReadHub项目Kotlin版转换指南(一.环境搭建) ReadHub项目Kotlin版转换指南(二.数据库和网络请求) ReadHub项目Kotlin版转换指南(三.MVP架构) Android ...
- Android Gradle Plugin指南(三)——依赖关系、android库和多项目配置
原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Dependencies-Android-Librari ...
- GitHub上最著名的Android播放器开源项目大全
GitHub上最著名的Android播放器开源项目大全 ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
随机推荐
- 实现一个ordeeddict
class MyOrderdict(): def __init__(self, mydict): self._cur = 0 self._mykeys = [] self._myvalues = [] ...
- 实践详细篇-Windows下使用VS2015编译的Caffe训练mnist数据集
上一篇记录的是学习caffe前的环境准备以及如何创建好自己需要的caffe版本.这一篇记录的是如何使用编译好的caffe做训练mnist数据集,步骤编号延用上一篇 <实践详细篇-Windows下 ...
- 基于babylon3D模型研究3D骨骼动画(1)
3D骨骼动画是实现较为复杂3D场景的重要技术,Babylon.js引擎内置了对骨骼动画的支持,但Babylon.js使用的骨骼动画的模型多是从3DsMax.Blender等3D建模工具转换而来,骨骼动 ...
- 服务器&阵列卡&组raid 5
清除raid信息后,机器将会读不到系统, 后面若进一步操作处理, raid信息有可能会被初始化掉,那么硬盘数据就有可能会被清空, 导致数据丢失, 否则如果只是清除raid信息,重做raid是可以还原系 ...
- file的基本操作;file的修改
file的基本操作 # Author:nadech # 文件读写/修改/ #data = open("yesterday",encoding="utf-8"). ...
- 如何恢复Initial commit之前的源文件
在github新建了一个空的库,然后到本地文件夹下,git init了一下,将remote和本地的关联起来了,然后git pull了一下,本地的项目源码全没了,用以下命令可以帮你恢复 git refl ...
- 实验与作业(Python)-03 Python程序实例解析
截止日期: 要求: 下周实验课前上交,做好后在实验课上检查可获取平时分. 做出进阶或选做的的请用清晰的标致标识出来,方便老师批改 本次作业:可提交也可不提交.作业算平时成绩. 本次作业内容量较大,请组 ...
- Android开发技巧——BaseAdapter的另一种优雅封装
RecyclerView虽然因其灵活性.高效性等特点而备受好评,但也不是一定得用它把ListView给替代掉.在某些场景中,ListView还是相对更适合的.比如数据量不大,不频繁更新,并且需要简单地 ...
- 用Matlab画直方图
简介 本文介绍如何使用matlab定制自己的直方图. 关键 使用Matlab的 bar() 函数创建柱状图 bar() 画的bin的高度跟数据相关 bar() 数据每一列一个group,有几列数据就画 ...
- Rails关闭html_safe字符串过滤
在某些情况下我希望html的文本中包含一些换行,因为html5产生换行的方法是插入 <br />所以我可以这么写: text = "hello world!<br /> ...