项目地址: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的更多相关文章

  1. 玩转Windows服务系列——使用Boost.Application快速构建Windows服务

    玩转Windows服务系列——创建Windows服务一文中,介绍了如何快速使用VS构建一个Windows服务.Debug.Release版本的注册和卸载,及其原理和服务运行.停止流程浅析分别介绍了Wi ...

  2. Apache Commons CLI官方文档翻译 —— 快速构建命令行启动模式

    昨天通过几个小程序以及Hangout源码学习了CLI的基本使用,今天就来尝试翻译一下CLI的官方使用手册. 下面将会通过几个部分简单的介绍CLI在应用中的使用场景. 昨天已经联系过几个基本的命令行参数 ...

  3. 使用Asp.net WebAPI 快速构建后台数据接口

    现在的互联网应用,无论是web应用,还是移动APP,基本都需要实现非常多的数据访问接口.其实对一些轻应用来说Asp.net WebAPI是一个很快捷简单并且易于维护的后台数据接口框架.下面我们来快速构 ...

  4. 利用Nodejs快速构建应用原型

    利用Nodejs快速构建应用原型 开发一个应用往往需要快速的构建原型,然后在此基础上设计和改进,前端可能立马能看到效果,但是后端业务逻辑不会那么快,这个时候其实我们需要额只是一些模拟数据,所以不需要真 ...

  5. C# Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面

    个人理解,开发应用程序的目的,不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景也最为复杂,包括但不限于:表格记录查询.报表查询.导出文件查询等等 ...

  6. Java Swing快速构建窗体应用程序

    以前接触java感觉其在桌面开发上,总是不太方便,没有一个好的拖拽界面布局工具,可以快速构建窗体. 最近学习了一下NetBeans IDE 8.1,感觉其窗体设计工具还是很不错的 , 就尝试一下做了一 ...

  7. 【Android】如何快速构建Android Demo

    [Android]如何快速构建Android Demo 简介 在 Android 学习的过程中,经常需要针对某些项目来写一些测试的例子,或者在做一些 demo 的时候,都需要先写 Activity 然 ...

  8. 使用 Responsive Elements 快速构建响应式网站

    Responsive Elements 可以使任何元素来适应和应对他们所占据的区域.这是一个轻量的 JavaScript 库,你可以轻松嵌入到你的项目.元素会更具自己的宽度,自动响应和适应空间的增加或 ...

  9. Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面 z

    http://www.cnblogs.com/zuowj/p/4504130.html 不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景 也最为 ...

随机推荐

  1. solr创建新的Core

    1.  在example目录下创建taotao-solr文件夹: 2.  将./solr下的solr.xml拷贝到taotao-solr目录下: 3.  在taotao-solr下创建taotao目录 ...

  2. Resizable(调整大小)组件

    一.加载方式 //class 加载方式 <div id="rr" class="easyui-resizable" data-options=" ...

  3. arcmap从excel坐标数据生成点shp文件

    概述 今天试图在ArcMap中将excel数据转成点文件,在"Display XY Data"的时候,无法选择X,Y字段,很是纳闷,原来Excel中列的格式是文本,导致无法选择.有 ...

  4. AngularJs练习Demo18 Resource

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  5. iOS_SN_CocoaPods使用详细说明( 转)

    一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来方便的统一管理这些第三方库. 二.安装 由于 ...

  6. 旧版asp.net 发送邮件代码

    说到发送邮件发送,先提一下SMTP(呵呵,高手就跳过这一段吧!). SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议.它是一组用于从源地址到目的地址传 ...

  7. 《Hadoop权威》学习笔记四:Hadoop的I/O

    一.数据完整性   二.压缩   三.序列化 基本概念 序列化指的是将结构化对象转化为字节流以便于通过网络进行传输或写入持久化存储的过程 反序列化指的是将字节流转为一系列结构化对象的过程. 进程间通信 ...

  8. WF学习

    1.添加argument 类的argument必须先在表达式里面实例化 argument和variable 没有区别啊??????? http://msdn.microsoft.com/en-us/l ...

  9. ssm+jsp+自定义标签实现分页,可以通用(后端实现)

    从controller到mapper.xml的后端实现 只梳理分页相关代码 1 controller里面相关 ModelAndView mv = new ModelAndView("/lis ...

  10. ubuntu 12.04 下搭接Qt 嵌入式开发环境

    1.安装前的准备工作 (1)有ubuntu12.04 的系统镜像(也可以其他linux 如Fedorea9),都是安装好的 (2)虚拟机VMWare 或 VirtualBox ,两者都可以,都是安装好 ...