博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dhroid - NetJSONAdapter 网络化的adapter
阅读量:5050 次
发布时间:2019-06-12

本文共 4405 字,大约阅读时间需要 14 分钟。

关于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() {@Overridepublic 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) {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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);传入第一个参数是原值第二个参数类型如实现为@Overridepublic 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返回的是DisplayImageOptionsDisplayImageOptions 是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方法

转载于:https://www.cnblogs.com/niray/p/4650329.html

你可能感兴趣的文章
Oracle学习之简单查询
查看>>
log4j配置
查看>>
linux 配置SAN存储-IPSAN
查看>>
双链表
查看>>
java学习笔记之String类
查看>>
pymysql操作mysql
查看>>
Linux服务器删除乱码文件/文件夹的方法
查看>>
牛腩记账本core版本源码
查看>>
Word Break II
查看>>
UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
查看>>
无线通讯
查看>>
Mongodb Manual阅读笔记:CH9 Sharding
查看>>
AX2009使用NPOI导出EXCEL2007
查看>>
如何删除NSDictionary或NSArray中的NSNull
查看>>
ueditor 结合easyui使用
查看>>
thymeleaf学习笔记
查看>>
进程(第一部分)
查看>>
【题解】 [ZJOI2006]书架 (Splay)
查看>>
Django ORM那些相关操作
查看>>
三星830 SSD的Smart值POR Recovery Count
查看>>