上一篇我们讲到了,  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项目-高考作文项目架构(三)的更多相关文章

  1. Android项目-高考作文项目架构(二)

    1, 普通的http json请求 请看下面架构草图: 这样就抽象出了其他Activity可能需要的Http Json请求的功能. 只要其他Activity有Http Json请求的需求都可以继承Ba ...

  2. Android项目-高考作文功能简介(一)

    前言 :  开发安卓也已2年多了近3年了, 在自己刚入行的时候就有自己独立开发一个App的想法. 后来自己做了<<高考作文>>这一App. 后面续续断断的维护者. 也因为功能简 ...

  3. Android项目-高考作文-使用ORMLite抽象公共的Dao层

    1, 定义统一的Dao接口 public interface IDao<T> { public abstract T getSingleById(int id); public abstr ...

  4. Android项目-高考作文-抽象BaseAdapter

    1, 在使用baseAdapter的时候,总是有需要重复的代码如: @Override public int getCount() { return list.size(); } @Override ...

  5. Android项目-高考作文-AsyncTask的不足

    1, AsyncTask的不足. 从android4.0开始, 后台只允许一个AsyncTask执行, 如果当前的AsyncTask没有执行完毕, 那么当前的请求一直处于等待状态. 直到上一个执行完毕 ...

  6. ReadHub项目Kotlin版开发指南(三、MVP架构)

    ReadHub项目Kotlin版转换指南(一.环境搭建) ReadHub项目Kotlin版转换指南(二.数据库和网络请求) ReadHub项目Kotlin版转换指南(三.MVP架构) Android ...

  7. Android Gradle Plugin指南(三)——依赖关系、android库和多项目配置

    原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Dependencies-Android-Librari ...

  8. GitHub上最著名的Android播放器开源项目大全

    GitHub上最著名的Android播放器开源项目大全                                                                          ...

  9. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

随机推荐

  1. sublime text3中设置Emmet输入标签自动闭合

    项目后端前一段时间从C#转成了JAVA,在开发的过程中,由于HTML对标签的语法很宽松,比如这样:<img src="" alt="">在标签的结尾 ...

  2. Jvm原理剖析与调优之内存结构

    一些不得不说的概念 JVM JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机包括一套字节码指令集.一组寄存器.一个栈.一个 ...

  3. Echarts 中国地图各个省市自治区自定义颜色

    前言 最近接了一个外包的项目,其中有个需求是这样的, 需要展示一个中国的统计地图,要求每个省市区都是不一样的颜色,必须特别区分开.以及隐藏南海部分. 看了Echats相关文档,发现有类似的demo,但 ...

  4. 3.5 find() 判断是否存在某元素

    vector 判断是否存在某元素: if(find(A.begin(), A.end(), A[i]) != A.end()){ // 若存在 A[i] // find() 返回一个指针 }

  5. Python练习之pillow

    此系列意在记录于一些有趣的程序及对其的总结. 问题来源: https://github.com/Yixiaohan/show-me-the-code https://github.com/HT524/ ...

  6. Bootstrap3 表单-水平排列的表单

    通过为表单添加 .form-horizontal 类,并联合使用 Bootstrap 预置的栅格类,可以将 label 标签和控件组水平并排布局.这样做将改变 .form-group 的行为,使其表现 ...

  7. Android服务——Service

    服务 Service 是一个可以在后台执行长时间运行操作而不使用用户界面的应用组件.服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行. 此外,组件可以绑定到服务,以与之进行 ...

  8. OpenCV+VS2013 属性表配置

    简介 计算机视觉任务越来越多的依赖著名的开源计算机视觉库OpenCV.OpenCV 2.0 包含了一系列精心设计数据结构和经过优化的视觉算法,大家可以短时间内开发一个不错的视觉应用.OpenCV支持多 ...

  9. Dubbo框架应用之(四)--Dubbo基于Zookeeper实现分布式实例

    上三篇文章主要是解决了概念性的补充和学习,充分结合实战来深入理解 入门实例解析 第一:provider-提供服务和相应的接口 创建DemoService接口 package com.unj.dubbo ...

  10. 20160214.CCPP体系详解(0024天)

    程序片段(01):CGI.c 内容概要:CGI-cloud #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main01(vo ...