快速构建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结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景 也最为 ...
随机推荐
- XAML 命名空间和命名空间映射
本主题将介绍大部分 XAML 文件的根元素中存在的 XML/XAML 命名空间 (xmlns) 映射.它还将介绍如何为自定义类型和程序集生成类似的映射. XAML 命名空间如何与代码定义和类型库相关 ...
- [Unity优化] Unity CPU性能优化
前段时间本人转战unity手游,由于作者(Chwen)之前参与端游开发,有些端游的经验可以直接移植到手游,比如项目框架架构.代码设计.部分性能分析,而对于移动终端而言,CPU.内存.显卡甚至电池等硬件 ...
- Go语言之defer
defer语句被用于预定对一个函数的调用.我们把这类被defer语句调用的函数称为延迟函数.注意,defer语句只能出现在函数或方法的内部. 一条defer语句总是以关键字defer开始.在defer ...
- 使用 c# 调用进程相关开发
最近在维护公司的以前项目中发现,使用到了进程相关知识.现在将此总结,以备后面查看复习. 一.进程查看器 程序在运行的时候,操作系统就会为其分配一个进程.那么进程到底是什么东西呢? 实际上,进程 ...
- VS2013配合EgretVS开发简单塔防游戏
VS2013配合EgretVS开发简单塔防游戏(1) - 环境配置 VS2013配合EgretVS开发简单塔防游戏(2) – 原型设计 VS2013配合EgretVS开发简单塔防游戏(3) – 精灵动 ...
- Activiti工作流学习-----基于5.19.0版本(8)
8.1.5 Start Event 继续上一篇的事件的分享笔记,Start Event指明该处是流程开始,至于开始事件的类型(消息到达开始,指定的事件循环开始等),定义如何开始是在开始事件圆圈图标里面 ...
- 对CNN模块的分析
对 CNN 模块的分析,该论文(Systematic evaluation of CNN advances on the ImageNet)已经做过了,里面的发现是非常有帮助的: 使用没有 bat ...
- Ubuntu常用命令速查手册-珍藏版-完整版
sudo apt-get install 软件名 安装软件命令 sudo nautilus 打开文件(有root权限) su root 切换到“root” ls 列出当前目录文件(不包括隐含文件) l ...
- 戏说WSGI(Python Web服务网关接口)--[转载]
戏说WSGI(Python Web服务网关接口) 当你在Python的世界中冒险,突然遭遇一只Web怪兽,你会选择什么武器对付它?在兵器谱上,下列兵器可谓名列前茅: Zope,厚重的长枪.较早出现的武 ...
- 从点击Button到弹出一个MessageBox, 背后发生了什么(每个UI线程都有一个ThreadInfo结构, 里面包含4个队列和一些标志位)
思考一个最简单的程序行为:我们的Dialog上有一个Button, 当用户用鼠标点击这个Button时, 我们弹出一个MessageBox. 这个看似简单的行为, 谁能说清楚它是如何运行起来的,背 ...