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方法

时间: 2024-07-30 21:59:38

dhroid - NetJSONAdapter 网络化的adapter的相关文章

Dhroid框架笔记(DhNet、Adapter)

3.1.1 DhNet用于获取网络中的数据 DhNet net=new DhNet("路劲"); net.addParam("key", "参数").addParam("key2", "参数2"); net.doGet(new NetTask(this) { @Override public void doInUI(Response response, Integer transfer) {//处理返回结果

Dhroid框架笔记

dhroid 目前包含了6大组件供大家使用1.Ioc容器: (用过spring的都知道)视图注入,对象注入,接口注入,解决类依赖关系2.Eventbus: android平台事件总线框架,独创延时事件,事件管理轻松3.Dhnet: 网络http请求的解决方案,使用简单,减少代码,自带多种网络访问缓存策略4.adapter模块: 数据绑定轻松,不用写多余的adapter,天生网络支持(一行代码搞定加载,刷新问题)5.DhDb: android中sqlite的最轻量orm框架(增删改查轻松搞定)6.

Android - dhroid 开发框架

extends:http://www.eoeandroid.com/thread-326973-1-1.html 开源中国地址:http://www.oschina.net/p/dhroid 开源项目地址:http://git.oschina.net/tengzhinei/dhroid 点我下载 dhroid 目前包含了6大组件供大家使用 1.Ioc容器: (用过spring的都知道)视图注入,对象注入,接口注入,解决类依赖关系{(1) ioc基础(视图,资源,assert注入) (2) ioc

Android 极速开发框架 dhroid

当我们编写Android程序时候会出现大量重复工作,dhroid框架就很好解决这个问题. dhroid 是基于android 平台, 极速开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.使你更快,更好的开发商业级别应用 dhroid 目前包含了6大组件供大家使用 1.Ioc容器: (用过spring的都知道)视图注入,对象注入,接口注入,解决类依赖关系 2.Eventbus: android平台事件总线框架,独创延时事件,事件管理轻松 3.Dhnet: 网络ht

Android开发--Adapter的应用

1.简介 Adapter的作用是为GridView,ListView等界面控件与数据之间搭建桥梁,每当列表里的每一项显示到页面时,都会调用到Adapter的getView方法 返回一个View.在Android API中内置了几个实现ListAdapter的Adapter,它们分别为BaseAdapter,SimpleAdapter(以Map形式存储静态数据), SimpleCursorAdapter.Adapter,数据和UI三者关系如下: 2.BaseAdapter 自定义BaseAdapt

设计模式之Adapter(适配器)(转)

定义: 将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份. 为何使用? 我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口. 怎么办? 使用Adapter,在这两种接口之间创建一个混合接口(混血儿). 如何使用? 实现Adapter方式,其实"think in Java"的"类再生"一节中已经提到,有两

适配器模式(Adapter)

1.定义: 适配器模式是将一个类的接口转换成客户端希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 结构与说明: Client:客户端,调用自己需要的领域接口Target. Target:定义客户端需要的跟特定领域相关的接口. Adaptee:已经存在的接口,但与客户端需要的特定领域接口不一致,需要被适配. Adapter:适配器,把Adaptee适配成Client需要的Target. 2.代码示例 (1)已经存在的应用接口,需要被适配的类Adaptee 1

Android中适用于ListView、GridView等组件的通用Adapter

今天随便逛逛CSDN,看到主页上推荐了一篇文章Android 快速开发系列 打造万能的ListView GridView 适配器,刚好这两天写项目自己也封装了类似的CommonAdapter,以前也在github上看到过这样的库,于是自己也把自己的代码再次整理出来与大家分享,也希望能够在CSDN这个平台上学到更多的东西,下面就一起来看看吧. 平时我们在项目中使用到ListView和GridView组件都是都会用到Adapter,比较多的情况是继承自BaseAdapter,然后实现getCount

ViewPager的Adapter中视图重用

ViewPager的PagerAdapter不像ListView/GridView的BaseAdapter,它是没有内部视图重用机制的,也就是说我先inflate出来一个,然后调用destroyItem后,这个视图就被抛弃了,如果需要更多的视图,则需要再次inflate.如果ViewPager中的所有视图基本相同,就存在内存的浪费了.这里使用一个非常简单的方法实现视图的重用: List<View> mViewList = new ArrayList<View>(); public