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和提供对下层数据的访问. 数据适配器作用:把复杂的数据(数组.链表.数 ...
随机推荐
- 【NLP】simhash判断文档相似度
http://blog.csdn.net/heiyeshuwu/article/details/44117473
- Windbg在软件调试中的应用
Windbg在软件调试中的应用 Windbg是微软提供的一款免费的,专门针对Windows应用程序的调试工具.借助于Windbg, 我们常见的软件问题:软件异常,死锁,内存泄漏等,就可以进行高效的排查 ...
- faster-rcnn原理及相应概念解释
R-CNN --> FAST-RCNN --> FASTER-RCNN R-CNN: (1)输入测试图像: (2)利用selective search 算法在图像中从上到下提取2000个左 ...
- 多线程 TCP 连接
TCP的Java支持 协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构.交换方式.包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP协议族有IP协议.TCP协议和UDP协议.现 ...
- AcceptEx 以及 获取远程IP与port
// 獲取本地以及遠程的IP和port setsockopt(clientfd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, (char *)&listenfd ...
- Win7 在安装vs2010后向sql2008添加SQL_Server_Management详解
VS2010自带sql server 2008,但自带的版本缺少SQL_Server_Management,解决如下: 安装的先决条件: 1.SQLManagementStudio_x86_CHS(h ...
- MyEclipse weblogic Deploy Location项目名称不正确解决方案
MyEclipse weblogic Deploy Location项目名称不正确 MyEclipse部署weblogic 项目,名称错误,是别的项目名称 ====================== ...
- C++ template —— 表达式模板(十)
表达式模板解决的问题是:对于一个数值数组类,它需要为基于整个数组对象的数值操作提供支持,如对数组求和或放大: Array<), y(); ... x = 1.2 * x + x * y; 对效率 ...
- (原创)Windows下使用android ADT工具dmtracedump.exe绘图
在windows下使用dmtracedump绘图时,出现如下错误: 'dot' 不是内部或外部命令,也不是可运行的程序 或批处理文件. 应该是没有dot这个执行程序,安装:Graphviz程序,然后将 ...
- Android学习之适配器SimpleCursorAdapter
三. SimpleCursorAdapter与SimpleAdapter用法相近.只是将List对象换成了Cursor对象.而且SimpleCursorAdapter类构造方法的第四个参数from ...