介绍:使用FunDapter之后,你就无须为每一个视图创建对应的Adapter,这是一种新的创建adapter的自定义方法,无须创建ViewHolder就可以使用ViewHolder模式,不仅可以减少代码中bug,并且可以使代码更整洁。
以前我们使用Listview adapter 时,需要做:
- 继承BaseAdapter或者复制其他已经写过的Adapter
- 创建ViewHolder类并且定义所有View
- 写(复制.. 你TM还在骗自己!) 整个ViewHolder创建代码
- 写出所有 "findViewById" .
- 开始在getView方法里面填充数据
现在使用FunDapter,你只需要:
- 创建一个 BindDictionary
- 加入字段Add fields.
- 实例化一个新的FunDapter,补充完整BindDictionary, 布局源文件和列表项
接下来看看代码中的实现
1.创建一个对象Product,数据源
public class Product {
public String title;
public String description;
public String imageUrl;
public double price;
}
2.创建一个BindDictionary实现:
BindDictionary<Product> dict = new BindDictionary<Product>();
3.加入基础的text字段:
(只需要提供text字段id,以前确认id对应对象Product的相应属性)
dict.addStringField(R.id.description,
new StringExtractor<Product>() {
@Override
public String getStringValue(Product item, int position) {
return item.description;
}
});
4.来一个高级功能:
(你能做一些更复杂的操作,比如设置字体(typeface()),加入visibilityIfNull() 则可以当属性为空时设置视图不可见.)
dict.addStringField(R.id.title,
new StringExtractor<Product>() {
@Override
public String getStringValue(Product item, int position) {
return item.title;
}
}).typeface(myBoldFace).visibilityIfNull(View.GONE);
5.什么,你需要加载图片,一样没问题:
(在StringExtractor里面返回对象Product的图片URL,你可以在loadDynamicImage里得到该URL与ImageView,并实现图片懒加载)
prodDict.addDynamicImageField(R.id.productImage,
new StringExtractor<Product>() {
@Override
public String getStringValue(Product item, int position) {
return item.imageUrl;
}
}, new DynamicImageLoader() {
@Override
public void loadDynamicImage(String url, ImageView view) {
//使用一些异步图片加载框架加载图上,比如Android-Universal-Image-Loader
}
});
6.最后,创建适配器:
FunDapter<Product> adapter = new FunDapter<Product>(getActivity(), productArrayList,
R.layout.product_list_item, dict);
大功告成,你只需要把该adapter添加到listView则可。
注:
该项目需要依赖一些文件,本人已打包成jar包(见博客附件),直接放到libs则可。
附上该框架github地址:
https://github.com/amigold/FunDapter