快速构建AdapterView的Adapter--ingeniousadapter
项目地址:ingeniousadapter
前面的话:本项目的原型是QuickAdapter,它们的思路基本一致,但本项目的优势在于:
- 支持AdapterView存在多个layout类型
- 可配置图片加载缓存库
在使用AdapterView时,我们需要使用Adapter来绑定数据源和AdapterView中的每一项数据。通常我们继承自BaseAdapter,然后重写四个方法:
public int getCount()
public Object getItem(int position)
public long getItemId(int position)
public View getView(int position, View convertView, ViewGroup parent)
其中主要的逻辑实现在getView,这个方法主要完成两步操作:1、生成(或者从缓存中取出)当前item对应的ItemView;2、将数据和ItemView绑定。通常,由于AdapterView支持缓存机制(如ListView),我们通过一个Holder来避免每一次getView重复的findViewById。
private static class Holder {
TextView tv_name;
ImageView iv_avatar;
.....
}
public View getView(int position, View convertView, ViewGroup parent) {
Holder hodler = null;
if(converView==null) {
holder = new Holder();
convertView = LayoutInflater.from(context)
.inflate(layoutId, parent, false);
holder.tv_name = (TextView) findViewById(R.id.tv_name);
holder.iv_avatar = (ImageView) findViewById(R.id.iv_avatar);
...
//下次就不需要findViewById了
covertView.setTag(holder);
}
holder =(Holder) convertView.getTag();
holder.tv_name.setText(***);
holder.iv_avatar.set(***);
}
以上就是BaseAdapter的典型用法,那么在项目里面的所有Adapter都存在Holder,并且都存在holder.properties = (ViewType) findViewById(id)
的重复代码。可以想象一下,如果Holder中有比较多的属性,特别是如果一个AdapterView具有多个不同类型的layout,那么也需要多个不同Holder,getView将会特别复杂。
geniousadapter对getView进行了一层封装,并将getView函数的两部分功能进行拆分,自动完成了生成ItemView和Holder的过程,通过一个抽象方法covert让子类实现数据绑定。子类需要实现两个抽象方法:
/**
* 通过AdapterHolder填充view的属性,这个函数主要完成数据绑定的过程,使用方法:
* holder.setText(R.id.tv_name,"张三").setText(R.id.tv_nickName,
* "三儿").setImageResource(R.id.iv_avatar,R.drawable.ic_user_avatar);
* holder
* item 当前item需要绑定的数据
*/
protected abstract void convert(AdapterHolder holder, T item,int viewType);
/**
* layoutid至数据类型的映射,插入顺序对应itemviewtype
* @return
*/
protected abstract int[] assignLayoutIDs();
holder.setImageUrl(int,imageUrl)
可以通过使用者自己定义远程图片加载的方式。用户可以自己实现加载图片或者使用第三方图片加载缓存库,其接口如下:
public interface ImageLoader {
public void load(ImageView imageView,String imageUrl);
//placeResId 默认图resid
public void load(ImageView imageView,String imageUrl,int placeResId);
}
比如我们可以使用picasso来完成加载图片的功能,在合适的位置来指定:
DefaultAdapterConfig.setImageLoader(new ImageLoader() {
@Override
public void load(ImageView imageView, String imageUrl) {
picasso.load(imageUrl).into(imageView);
}
@Override
public void load(ImageView imageView, String imageUrl, int placeResId) {
picasso.load(imageUrl).placeholder(placeResId).into(imageView);
}
});
总结:genious Adapter可以使用户在getView方法中无需关注每一项ItemView生成的细节,而只需要处理数据绑定的逻辑即可。
快速构建AdapterView的Adapter--ingeniousadapter的更多相关文章
- 玩转Windows服务系列——使用Boost.Application快速构建Windows服务
玩转Windows服务系列——创建Windows服务一文中,介绍了如何快速使用VS构建一个Windows服务.Debug.Release版本的注册和卸载,及其原理和服务运行.停止流程浅析分别介绍了Wi ...
- Apache Commons CLI官方文档翻译 —— 快速构建命令行启动模式
昨天通过几个小程序以及Hangout源码学习了CLI的基本使用,今天就来尝试翻译一下CLI的官方使用手册. 下面将会通过几个部分简单的介绍CLI在应用中的使用场景. 昨天已经联系过几个基本的命令行参数 ...
- 使用Asp.net WebAPI 快速构建后台数据接口
现在的互联网应用,无论是web应用,还是移动APP,基本都需要实现非常多的数据访问接口.其实对一些轻应用来说Asp.net WebAPI是一个很快捷简单并且易于维护的后台数据接口框架.下面我们来快速构 ...
- 利用Nodejs快速构建应用原型
利用Nodejs快速构建应用原型 开发一个应用往往需要快速的构建原型,然后在此基础上设计和改进,前端可能立马能看到效果,但是后端业务逻辑不会那么快,这个时候其实我们需要额只是一些模拟数据,所以不需要真 ...
- C# Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面
个人理解,开发应用程序的目的,不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景也最为复杂,包括但不限于:表格记录查询.报表查询.导出文件查询等等 ...
- Java Swing快速构建窗体应用程序
以前接触java感觉其在桌面开发上,总是不太方便,没有一个好的拖拽界面布局工具,可以快速构建窗体. 最近学习了一下NetBeans IDE 8.1,感觉其窗体设计工具还是很不错的 , 就尝试一下做了一 ...
- 【Android】如何快速构建Android Demo
[Android]如何快速构建Android Demo 简介 在 Android 学习的过程中,经常需要针对某些项目来写一些测试的例子,或者在做一些 demo 的时候,都需要先写 Activity 然 ...
- 使用 Responsive Elements 快速构建响应式网站
Responsive Elements 可以使任何元素来适应和应对他们所占据的区域.这是一个轻量的 JavaScript 库,你可以轻松嵌入到你的项目.元素会更具自己的宽度,自动响应和适应空间的增加或 ...
- Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面 z
http://www.cnblogs.com/zuowj/p/4504130.html 不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景 也最为 ...
随机推荐
- openwrt interface
orige : http://www.cnblogs.com/preorder69/p/3959187.html 这篇算是对openwrt网络接口的一个翻译吧,源地址:http://wiki.open ...
- textarea固定大小,不可拖动
写前端,经常很多小东西容易忽略忘记,今天写页面碰到设定一个输入框大小,死活记不起怎么固定,故找了一下度娘,其实添加一个css属性就好了: resize: none; 随笔记一下!
- ---添加一条记录返回一条记录的ID
INSERT INTO Web_AD(PID,ADType,ADTitle,ADTitle1,ADTitle2,ADTarget,LinkURL,DispalyWords,ADCode,UploadI ...
- ECSTORE 新建APP应用
1.用命令新建app // ----- window平台 ----- 直接运行 " 站点根目录/app/base/cmd.bat " 出现命令行后输入 dev:new app my ...
- 利用css3-animation来制作逐帧动画
前言 趁着还没有元旦之前先码一篇文章,不然到时候估计又被各种虐了,所以趁现在还有力气先来一篇.今天来聊聊css3中的动画属性animation,对这个属性懵懂是在很早的时候有前辈用这个 animati ...
- 修改textField的placeholder的字体颜色、大小
textField.placeholder = @"username is in here!"; [textField setValue:[UIColor redColor] fo ...
- 设置iOS项目BuildVersion自动增加-备用
一.概念阐述:Build与Version的区别 在iOS中有两种“版本号”,也就是所谓的version号与build号,如下图所示: 我们用最简洁的语言来区分这两个版本号的区别以及用途如下: Vers ...
- jquery幻灯片--渐变
网站上为了设计,需要一些幻灯片效果,现在网站有很多插件可以使用. 想要成为以为牛逼的程序员,绝对不允许只会用别人的插件而已,不然你只能是“代码”的搬运工,而不敢做出自己的创新. 首先使用jquery做 ...
- PHP 中filter_var的使用
filter_var() 函数通过指定的过滤器过滤变量. 如果成功,则返回已过滤的数据,如果失败,则返回 false. 语法 :filter_var(variable, filter, options ...
- MySQL的SQL_CALC_FOUND_ROWS真的很慢么?
分页程序一般由两条SQL组成: SELECT COUNT(*) FROM ... WHERE .... SELECT ... FROM ... WHERE LIMIT ... 如果使用SQL_CALC ...