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 ...
随机推荐
- Java 读取 json文件
public ResponseBean getAreas() { String path = getClass().getClassLoader().getResource("area.js ...
- Tomcat,eclipse热部署的三种方式
热部署是指在你修改项目BUG的时候对JSP或JAVA类进行了修改在不重启WEB服务器前提下能让修改生效.但是对配置文件的修改除外! 怎么说呢?热部署其实用的算少了,热部署怎么说都是个人部署的,大点的公 ...
- mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法
[CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...
- 初识RabbitMQ系列之三:.net 如何使用RabbitMQ
话不多说,直接上代码! 一:搭建一个解决方案框架:RabbitMQ_Demo 其中包含4个部分: 1:RabbitMQ 公用类库项目 2:一个生产者控制台项目 3:两个消费者控制台项目 项目结构如图: ...
- Spring boot集成swagger2
一.Swagger2是什么? Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件. Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格 ...
- Jupyter notebook 输出含中文的pdf 方法
我电脑 OS 是 Ubuntu14.04, 可用的最简单方法是: 打开终端,输入 sudo find / -name article.tplx 用以查找 article.tplx 文件位置,我电脑的结 ...
- Oracle中的列转行例子详解
数据如下:name id张三 1,2,3 要求实现:name id张三 1张三 2张三 3 --创建临时表 create table tmp as(select '张三' name, '1,2,3' ...
- Kafka生产者-向Kafka中写入数据
(1)生产者概览 (1)不同的应用场景对消息有不同的需求,即是否允许消息丢失.重复.延迟以及吞吐量的要求.不同场景对Kafka生产者的API使用和配置会有直接的影响. 例子1:信用卡事务处理系统,不允 ...
- python中的函数(定义、多个返回值、默认参数、参数组)
函数定义 在python中函数的定义以及调用如下代码所示: def test(x): y = x+1 return y result = test(2) print(result) 多个返回值的情况 ...
- ACM 继续畅通工程
Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计 ...