关于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