dhroid - NetJSONAdapter 网络化的adapter
关于adapter 我想对于大家来说已经不陌生了,基本应用都会用的很多,不知道现在你是不是还是按一定的套路写很多代码去实现adapter
我想大多数人还是写个adapter继承自baseadapter 实现getView方法(我想大家还会用网络流行的viewholder模式吧),
如果数据来自网络用个网络访问工具访问数据,数据转换,然后add进adapter,如果有下拉刷新,加载更多代码会更多
问题
1.你在写很多重复代码
2.数据管理不是那么容易
3.网络缓存需要处理
如果你使用dhroid框架,这些问题可以很好的解决
先看下下面的代码
NetJSONAdapter adapter=new NetJSONAdapter("http://shishangquan.017788.com/mobile_ordermeal_jujiList", this, R.layout.adapter_item);
//添加参数
adapter.addparam("key1", "key1");
//数据绑定
adapter.addField("username", R.id.name);
adapter.addField("title", R.id.title);
//数据绑定 进行文本修饰
adapter.addField("pubdate", R.id.time,"time");
//数据绑定 进行图片修饰
adapter.addField("user_faceimg", R.id.pic,"round");
//缓存策略
adapter.useCache(CachePolicy.POLICY_CACHE_AndRefresh);
//刷新
adapter.refresh();
//绑定到listview中
listV.setAdapter(adapter); //这段代码进行了网络访问,生成视图,数据绑定,缓存策略等问题
会通过R.layout.adapter_item生成视图,这里生成的视图用了重用机制,和ViewHolder模式(居然我感觉ViewHolder用处不大)
假设网络返回的结果是
{
success:true,
data:[{
username:'藤之内',
title:'大家好',
pubdate:1394707561,
user_faceimg:'头像路径'
},{
}]
}
NetJSONAdapter 会自动进行解析数据
会将username绑定到id为R.id.name的textview上
会将pubdate绑定到id为R.id.time 的textview上,这里需要进行数据转化,获取到的值是1394707561,最后显示当然为2012-11-08 我们在最后一个参数写为time ,具体的转化是写到ValueFix接口的(下面在说)
会将user_faceimg获取到的图片路径绑定到R.id.pic的imageView,这里也做了个转化,是将图片截圆角, 我们在最后一个参数写为round,具体的转化是写到ValueFix接口的(下面在说)
adapter.useCache(CachePolicy.POLICY_CACHE_AndRefresh);可以进行缓存策略,具体的缓存策略大家看DhNet的文档吧
adapter.refresh();刷新
我们先说网络相关的
添加参数 adapter.addparam("key1", "key1");//
加载下一页 adapter.showNext();
加载下一页有对话框 adapter.showNextInDialog();
缓存策略(查看dhnet文档)
adapter.useCache(CachePolicy.POLICY_CACHE_AndRefresh);
加载第一页时是否有对话康 adapter.showProgressOnFrist(true);
数据处理相关
拿哪个节点作为数据(支持点分割)
adapter.fromWhat("aaa.bbb"); //如果你的结果不是在某个节点而是需要处理后才有的 adapter.setDataBulider(new DataBulider() { @Override
public JSONArray onDate(Response response) {
return response.jSONArrayFrom("xxx");
}
}); adapter.addField("title", R.id.title);
//数据绑定 进行文本修饰
adapter.addField("pubdate", R.id.time,"time");
//数据绑定 进行图片修饰
adapter.addField("user_faceimg", R.id.pic,"round"); 如果你需要控制显示与隐藏等 adapter.addField(new FieldMap("activeaddress", R.id.content) {
@Override
public Object fix(View itemV, Integer po, Object o, Object jo) {
JSONObject joo=(JSONObject) jo;
//这里可以做一些额外的工作
itemV.findViewById(R.id.icon).setVisibility(JSONUtil.getInt(joo, "status")==1?View.VISIBLE:View.INVISIBLE);
return o;
}
});
事件回调每次加载完成后在这处理
//加载成功后回调
adapter.setOnLoadSuccess(new LoadSuccessCallBack() {
@Override
public void callBack(Response response) {
if(response.isSuccess()){
dialoger.showToastShort(getActivity(), "加载成功");
if(adapter.getPageNo()==1){
listV.setSelection(0);
} }
}
}); 内部点击事件 //内部点击事件
adapter.setOnInViewClickListener(R.id.pic, new BeanAdapter.InViewClickListener() {
@Override
public void OnClickListener(View itemV, View v, Integer po,
Object jo) {
JSONObject joo=(JSONObject) jo;
dialoger.showToastLong(getActivity(), JSONUtil.getString(joo, "username"));
}
});
adapter需要配置的常量(配置在application中)
//分页参数
Const.netadapter_page_no = "p";
//分页参数的长度
Const.netadapter_step = "step"; //默认分页长度
Const.netadapter_step_default = 7;
//时间线参数(传入后台的key)
Const.netadapter_timeline = "timeline"; //时间线取哪个字段
Const.netadapter_json_timeline="pubdate";
关于时间线指每次会将上次最后一条的哪个属性作为下次访问的参数
下面说说上面提到的数据修饰问题
数据修饰需要在ioc中配置实现了ValueFix接口的类
接口有下面方法
如果是textview和且子类调用
public abstract Object fix(Object obj, String s);
传入第一个参数是原值第二个参数类型
如实现为
@Override
public Object fix(Object o, String type) {
if (o == null)
return null;
if ("time".equals(type)) {
return getStandardTime(Long.parseLong (o.toString()) * 1000,
"yyyy-MM-dd");
} return o;
}
传入的是1394707561和'time' 返回的是2014-11-08 如果是imageview
public abstract DisplayImageOptions imageOptions(String s);
出入的是类型 round返回的是DisplayImageOptions
DisplayImageOptions 是universalimageloader.jar中的我们使用的是图片加载就是它
我还要说明下NetJSONAdapter的继承关系
NetJSONAdapter继承了BeanAdapter类实现了INetAdapter接口
BeanAdapter 对数据进行了很好的管理和视图绑定实现时
public abstract void bindView(View view, int i, Object obj);
可以仿照NetJSONAdapter的bindView实现
INetAdapter定义了网络相关的方法
public String getTag(); public void refresh(); public void setOnLoadSuccess(LoadSuccessCallBack loadSuccessCallBack); public void removeOnLoadSuccess(LoadSuccessCallBack loadSuccessCallBack); public void setOnTempLoadSuccess(LoadSuccessCallBack loadSuccessCallBack); public Boolean hasMore(); public void showNext(); // public boolean isLoding(); public void showNextInDialog();
这样在实现的listview中可以根据adapter的类型进行网络操作
如果你的list的item特别特别复杂我想你最好是写一个MyAdapter 继承自NetJSONAdapter,重新实现getView方法
dhroid - NetJSONAdapter 网络化的adapter的更多相关文章
- Dhroid框架笔记(DhNet、Adapter)
3.1.1 DhNet用于获取网络中的数据 DhNet net=new DhNet("路劲"); net.addParam("key", "参数&qu ...
- Android 快速开发框架:推荐10个框架:afinal、ThinkAndroid、andBase、KJFrameForAndroid、SmartAndroid、dhroid..
对于Android初学者以及对于我们菜鸟,这些大神们开发的轻量级框架非常有用(更别说开源的了). 下面转载这10个框架的介绍:(按顺序来吧没有什么排名). 一. Afinal 官方介绍: Afina ...
- Dhroid框架笔记(IOC、EventBus)
dhroid 目前包含了6大组件供大家使用1.Ioc容器: (用过spring的都知道)视图注入,对象注入,接口注入,解决类依赖关系2.Eventbus: android平台事件总线框架,独创延时事件 ...
- Android - dhroid 开发框架
extends:http://www.eoeandroid.com/thread-326973-1-1.html 开源中国地址:http://www.oschina.net/p/dhroid 开源项目 ...
- 设计模式(七): 通过转接头来观察"适配器模式"(Adapter Pattern)
在前面一篇博客中介绍了“命令模式”(Command Pattern),今天博客的主题是“适配器模式”(Adapter Pattern).适配器模式用处还是比较多的,如果你对“适配器模式”理解呢,那么自 ...
- 设计模式(七)适配器模式(Adapter Pattern)
一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...
- ListView和Adapter数据适配器的简单介绍
ListView 显示大量相同格式数据 常用属性: listSelector listView每项在选中.按下等不同状态时的Drawable divider ...
- Android之RecyclerView的原生Bug-Inconsistency detected. Invalid view holder adapter positionViewHolder{a1bbfa3 position=2 id=-1, oldPos=-1, pLpos:-1 no parent}
今天在运行自己编写的App时,突然发现App在运行时闪退,然后就查看了Android Studio的Log,发现了这个错误,上网查了一下,才知道是RecyclerView的原生Bug,在数据更新时会出 ...
- Android——Adapter
Adapter——本身只是一个接口.Adapter是将数据绑定到UI界面上的桥接类.Adapter负责创建显示每个项目的子View和提供对下层数据的访问. 数据适配器作用:把复杂的数据(数组.链表.数 ...
随机推荐
- C# 异步锁【转】
原文:http://www.yalongyang.com/2013/01/c-sharp-await-lock/ 在C#中,普通用锁很简单 object m_lock = new object(); ...
- Kafka配置说明
Broker Configs Property Default Description broker.id 每个broker都可以用一个唯一的非负整数id进行标识:这个id可以作为broker的 ...
- input checkbox复选框点击获取当前选中状态jquery
function checkAll(id) { //用is判断 // let checkStatus=$(id).is(':checked'); // console.log(checkStatus) ...
- 详解ABBYY FineReader 12内置的自动化任务
要使用ABBYY FineReader处理文档,需要完成四个步骤:获取文档图像>识别该文档>验证结果>以选取的格式保存结果.如果需要再三地重复相同的步骤,您可以使用ABBYY Fin ...
- Base64编码——学习笔记
Base64是一种编码方式. 非加密 chcp->936 编码流程: 位数不够后面补0,例中补了2个0. 末尾加=表示结束符. GB2312,有些敏感词不能显示. GBK,是GB2312升级版. ...
- 在Linux上安装SVN服务
1.安装SVNyum install subversion 2.查看版本svnserve --version3.创建目录mkdir -p /web/svndata3.创建repo测试库svnadmin ...
- 7 -- Spring的基本用法 -- 11... 基于XML Schema的简化配置方式
7.11 基于XML Schema的简化配置方式 Spring允许使用基于XML Schema的配置方式来简化Spring配置文件. 7.11.1 使用p:命名空间简化配置 p:命名空间不需要特定的S ...
- jQuery Colorbox弹窗插件使用教程小结、属性设置详解以及colorbox关闭
jQuery Colorbox是一款弹出层,内容播放插件,效果极佳,当然我主要是用来弹出图片啦. jQuery Colorbox不仅有弹性动画效果,淡入淡出效果,幻灯片播放,宽度自定义,还能够ajax ...
- MyBatis入门程序之mapper映射文件常用配置命令
1.ResultMap高级结果映射 如果查询出的列名和属性名不一致,可以通过ResultMap做映射,放在statement的输出类型中 如下: 2.动态SQL,使用各种动态标签实现动态拼接sql,常 ...
- Python easyGUI 文件对比 覆盖保存
#在35-3的基础上进行优化,当用户点击ok按钮的时候,对打开的文件进行检查是否修改.# 如果修改过,则提示覆盖保存.放弃保存.另存为并实现相应的功能 1 import easygui as g im ...