关于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的更多相关文章

  1. Dhroid框架笔记(DhNet、Adapter)

    3.1.1 DhNet用于获取网络中的数据 DhNet net=new DhNet("路劲"); net.addParam("key", "参数&qu ...

  2. Android 快速开发框架:推荐10个框架:afinal、ThinkAndroid、andBase、KJFrameForAndroid、SmartAndroid、dhroid..

    对于Android初学者以及对于我们菜鸟,这些大神们开发的轻量级框架非常有用(更别说开源的了). 下面转载这10个框架的介绍:(按顺序来吧没有什么排名). 一.  Afinal 官方介绍: Afina ...

  3. Dhroid框架笔记(IOC、EventBus)

    dhroid 目前包含了6大组件供大家使用1.Ioc容器: (用过spring的都知道)视图注入,对象注入,接口注入,解决类依赖关系2.Eventbus: android平台事件总线框架,独创延时事件 ...

  4. Android - dhroid 开发框架

    extends:http://www.eoeandroid.com/thread-326973-1-1.html 开源中国地址:http://www.oschina.net/p/dhroid 开源项目 ...

  5. 设计模式(七): 通过转接头来观察"适配器模式"(Adapter Pattern)

    在前面一篇博客中介绍了“命令模式”(Command Pattern),今天博客的主题是“适配器模式”(Adapter Pattern).适配器模式用处还是比较多的,如果你对“适配器模式”理解呢,那么自 ...

  6. 设计模式(七)适配器模式(Adapter Pattern)

    一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...

  7. ListView和Adapter数据适配器的简单介绍

    ListView 显示大量相同格式数据 常用属性: listSelector            listView每项在选中.按下等不同状态时的Drawable divider            ...

  8. 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,在数据更新时会出 ...

  9. Android——Adapter

    Adapter——本身只是一个接口.Adapter是将数据绑定到UI界面上的桥接类.Adapter负责创建显示每个项目的子View和提供对下层数据的访问. 数据适配器作用:把复杂的数据(数组.链表.数 ...

随机推荐

  1. 基于bootstrap-multiselect.js的下拉框联动

    背景:当option特别多时,一般的下拉框选择起来就有点力不从心了,所以使用multiselect是个很好的选择,可以通过输入文字来选择选项很方便,但是有一个需要下拉框联动,网上找了半天才找到解决方法 ...

  2. 怎么设置BarTender中二维码大小为25*25

    有小伙伴近期问了小编一个问题,说客户需要25*25大小的QR Code二维码,用BarTender怎么做出来?想要指定条形码的大小,还得BarTender符号与版本选项来帮忙.本文小编就来给大家详细讲 ...

  3. 使用System.Web.Optimization对CSS和JS文件合并压缩

    在ASP.NET MVC 中JS/CSS文件动态合并及压缩通过调用System.Web.Optimization定义的类ScriptBundle及StyleBundle来实现. 大致步骤如下: 1.A ...

  4. Grunt--Less

    摘要: 之前介绍了自动构建工具Grunt,其中有一个模块是"grunt-contrib-less",下面是配置Grunt自动编译less文件. 安装: Grunt是基于node,功 ...

  5. 禁止requests请求https的提示InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more

     提示这个 InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from ...

  6. Java通过复选框控件数组实现添加多个复选框控件

    编写程序,通过复选框控件数组事先选择用户爱好信息的复选框,在该程序中,要求界面中的复选框数量可以根据指定复选框名称的字符串数组的长度来自动调节. 思路如下: 创建JPanel面板对象: 使用JPane ...

  7. Apache性能优化总结

    1.介绍 首先要了解Apache采用的MPM(Multi -Processing Modules,多道处理模块),MPM是Apache的核心,它的作用是管理网络连接.调度请求.Apache2.0中MP ...

  8. 开启apache的server-status辅助分析工具

    在Apache的调优过程中,可以通过查看Apache提供的server-status(状态报告)来验证当前所设置数值是否合理,在httpd.conf文件中做如下设置来打开: #加载mod_status ...

  9. Java md5加密 控制台传入与web传入参数 结果不匹配 || 相同字符串加密结果不同,如何保证JAVA MD5加密结果在不同的环境下都相同

    开发中遇到md5加密不一致问题,排除了上下文编码,加密内容问题. 爬了各类资料,最终找到了原因. /** 对字符串进行MD5加密 */ private static String encodeByMD ...

  10. Ansible 使用 Playbook 安装 Nginx

    思路:先在一台机器上编译安装好 Nginx,打包,然后通过 Ansible 下发 [root@localhost ~]$ cd /etc/ansible/ [root@localhost ansibl ...