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 ...
随机推荐
- vue开发中遇到的问题集锦(2)
1,在搭建了一个vue的脚手架之后,写了第一个组件,路由也已经配置完毕,且页面的路由显示是:http://localhost:8080/#/userLogin,userLogin里面有内容,但是页面显 ...
- 一个蒟蒻对FFT的理解(蒟蒻也能看懂的FFT)
建议同学们先自学一下"复数(虚数)"的性质.运算等知识,不然看这篇文章有很大概率看不懂. 前言 作为一个典型的蒟蒻,别人的博客都看不懂,只好自己写一篇了. 膜拜机房大佬 HY 一. ...
- spring web项目下,判断项目是否启动完成
本文同时发布于见鬼网:https://faceghost.com/article/483341 概述:spring 加载完成后,我们有时候会做一些初始化工作,如加载一些缓存,DB,等,这里采用实现Se ...
- 跟着小菜学习RabbitMQ启动和基础(系列一)
前言 今天开始我们正式进入RabbitMQ系列学习,在这系列博客中也会发表.NET Core和EF Core文章,网上关于RabbitMQ例子比比皆是,我将综合网上所提供的信息并加上我个人的理解来详细 ...
- 一起撸个简单粗暴的Tv应用主界面的网格布局控件(上)
这一篇是真的隔了好久了~~,也终于可以喘口气来好好写博客了,这段时间实在是忙不过来了,迭代太紧.好,废话不多说,进入今天的主题. 效果 图一是Tv应用:当贝市场的主页 图二是咱自己撸的简单粗暴的 Tv ...
- MongoDB 排序
MongoDB sort()方法 在MongoDB中使用使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 ...
- JavaScript Window Navigator
window.navigator 对象包含有关访问者浏览器的信息. Window Navigator window.navigator 对象在编写时可不使用 window 这个前缀. 实例 <d ...
- Python 字符串字典内置函数&方法
Python字典包含了以下内置函数: 序号 函数及描述 1 cmp(dict1, dict2)比较两个字典元素. 2 len(dict)计算字典元素个数,即键的总数. 3 str(dict)输出字典可 ...
- Python3 输入和输出
输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数.(第三种方式是使用文件对象的 write() 方法; 标准输出文件可以用 sys.stdout 引用.) 如果你希望输 ...
- linux系统性能监控--I/O利用率
尽管整体的处理器速度. 内存大小以及 I/O执行速度在不断提高,但 I/O操作的吞吐率和延迟性能仍然要比等价的内存访问操作低多个数量级.另外,由于许多工作负荷都拥有重要的I/O组件,I/O处理很容易成 ...