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 ...
随机推荐
- eclipse的maven操作无反应
第一 查eclipse能不能正常用 hi world.java 第二 查maven能不能正常用 cmd: mvn -v 第三 看看maven和eclipse是不是64位之类的 第四 maven和ecl ...
- SQL注入原理及绕过安全狗
1.什么是SQL注入攻击 SQL注入攻击指的是通过构造特殊的输入作为参数插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令 http://www.xxx.com/list. ...
- JAVA中抽象类的使用
抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象.抽象类体现的就是一种模板模式的设计,抽象父类可以只定义需要使用的某些方法,把不能实现的某些部分抽象成抽象方法,留给其子类去实现.具体来说,抽 ...
- 验证码识别之w3cschool字符图片验证码(easy级别)
起因: 最近在练习解析验证码,看到了这个网站的验证码比较简单,于是就拿来解析一下攒攒经验值,并无任何冒犯之意... 验证码所在网页: https://www.w3cschool.cn/checkmph ...
- ACM 排列2
Ray又对数字的列产生了兴趣: 现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数. Input每组数据占一行,代表四张卡片上的数字(0<=数字<=9 ...
- 在查询语句中使用 NOLOCK 和 READPAST
对于非银行等严格要求事务的行业,搜索记录中出现或者不出现某条记录,都是在可容忍范围内,所以碰到死锁,应该首先考虑,我们业务逻辑是否能容忍出现或者不出现某些记录,而不是寻求对双方都加锁条件下如何解锁的问 ...
- Linux Shell编程参考大全
本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...
- windows pe
下载adk https://www.microsoft.com/en-us/download/details.aspx?id=30652 安装 C:\Program Files (x86)\Windo ...
- Android 动态加载(防止逆向编译) jar混淆加密
最近工作中接到了一个研究防止逆向编译的任务.研究了几天资料,最后基本实现了防破解技术,在这个工程中,也略有一些心得体会,现整理下来分享,供大家探讨参考研究.文中如有纰漏.失实之处,请大家及时给与指正. ...
- OSTC 2015
上周六去北京参加了OSTC 2015开源技术大会,并分享了<Spark技术内幕>,主要涵盖了Spark Core的核心实现.我主要以WordCount为例,讲解了任务调度的具体实现,资源分 ...