最标准的写法,就是为每一个AdapterView的子View新建一个对应的ViewHolder,同时声明为prtivate final static。ViewHolder类中定义各种成员变量。

    public final static class ViewHolder{
ImageView iv;
TextView text;
Button btn;
}

在适配器的getView()方法中我们一般会这么写:

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder;

if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
convertView.setTag(holder); } else {
holder = (ViewHolder) convertView.getTag();
} holder.text.setText("line" + position);
  return convertView;
} private class ViewHolder {
  TextView text;
}

常规方法介绍完毕,我们现在找到了一个等价的作法,而且代码很简洁。

ViewHolder中写了一个静态方法,用泛型提供了高扩展性。我们可以通过get方法得到各种view的子类,比如imageView,button,TextView之类的。

public class ViewHolder {
// I added a generic return type to reduce the casting noise in client code
@SuppressWarnings("unchecked")
public static <T extends View> T get(View view, int id) {
SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
if (viewHolder == null) {
viewHolder = new SparseArray<View>();
view.setTag(viewHolder);
}
View childView = viewHolder.get(id);
if (childView == null) {
childView = view.findViewById(id);
viewHolder.put(id, childView);
}
return (T) childView;
}
}

在适配器中,我们可以进行如下配置(仅仅是举例)

    @Override
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) {
// init convertView by layout
convertView = LayoutInflater.from(context.inflate(R.layout.item, parent, false));
}
ImageView imageView = ViewHolder.get(convertView, R.id.imageView_id);
imageView.setImageResource(R.drawable.ic_launcher); return convertView;
}

这里的知识点是SparseArray<View>,SparseArray<View>在代码理解上等价于HashMap<Interger, View>,SparseArray是Android提供的一个数据结构,旨在提高查询的效率。所以View childView = viewHolder.get(id);这句代码的时间上的开销是极小的,完全不会影响到执行的效率。

参考自:

http://my.oschina.net/jack1900/blog/289164

http://blog.csdn.net/hmily7532361/article/details/18368235

ViewHolder的标准写法的更多相关文章

  1. html标记语言的标准写法-参考自http://www.zhihu.com/question/20797118/answer/16212312

    网页头部的声明应该是用 lang="zh" 还是 lang="zh-cn"?   添加评论   查看全部 12 个回答   skydiver ,程序员 5 人赞 ...

  2. 在系统方法中调用navigationController的标准写法

    在系统方法中调用navigationController的标准写法 -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animat ...

  3. $.ajax()参数详解及标准写法(转)

    1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...

  4. 探寻main函数的“标准”写法,以及获取main函数的参数、返回值

    main函数表示法        很多同学在初学C或者C++时,都见过各种各样的main函数表示法: main(){/*...*/} void main(){/*...*/} int main(){/ ...

  5. jQuery ajax 标准写法及进度条绘制

    jQuery ajax 标准写法及进度条绘制 $.ajax({ url: "http://www.microsoft.com", //请求的url地址 dataType: &quo ...

  6. 从IntToHex()说起,栈/堆地址标准写法 good

    学习中的一些牢骚.栈/堆地址标准写法. 2017-02-12 • 杂谈 • 暂无评论 • 老衲 •浏览 226 次 我一直都在寻找各种业务功能的最简单写法,用减法的模式来开发软件.下面是我的写法,如果 ...

  7. JQuery的Ajax标准写法

    Ajax的标准写法 $.ajax({ url:"http://www.xxx",//请求的url地址 dataType:"json",//返回的格式为json ...

  8. ajax标准写法

    ajax 标准写法 $.ajax({ url:"http://www.microsoft.com", //请求的url地址 dataType:"json", / ...

  9. SQL学习(二)之四大查询语句以及标准写法

    SQL四大查询语句——增删改查 增-INSERT INSERT INTO 表 (字段列表) VALUES(值列表) INSERT INTO `user_table` (`ID`, `username` ...

随机推荐

  1. 【LOJ】#2550. 「JSOI2018」机器人

    题解 我不会打表找规律啊QAQ 规律就是 对于\(n = m\)我们每一条左下到右上的对角线上的点的走法都是一样的且每n步一个轮重复 对于\(n != m\)我们找到最大公约数\(d\),在每个\(d ...

  2. HTML5 标签语法变化和使用概念

    1.H5与H4的区别 概念的变化: H5更注重内容与结构,不再只专注于表现. 声明与标签: 新的声明背简化: <!DOCTYPE html> <meta charset=utf-8& ...

  3. thinkphp中order方法

    order方法属于模型的连贯操作方法之一,用于对操作的结果排序. 用法 $Model->where('status=1')->order('id desc')->limit(5)-& ...

  4. Android SDK platforms build-tools等镜像下载

    Android SDK platforms build-tools等镜像下载     下载地址:http://mirrors.neusoft.edu.cn/android/repository/  这 ...

  5. Web开发模式演变(转)

    add by zhj:目前用的最多应该是模式二,其次是三.四,而模式五比较新,我自己也不太懂. 模式二--前后台交互的方式为整个页面,即每次请求,服务器都将HTML模板渲染后发给客户端,每次请求都返回 ...

  6. Xamarin iOS教程之编辑界面编写代码

    Xamarin iOS教程之编辑界面编写代码 Xamarin iOS的Interface Builder Interface Builder被称为编辑界面.它是一个虚拟的图形化设计工具,用来为iOS应 ...

  7. Xamarin iOS教程之自定义视图

    Xamarin iOS教程之自定义视图 Xamarin iOS自定义视图 工具栏中的视图在实际应用开发中用的很多,但是为了吸引用户的眼球,开发者可以做出一些自定义的视图. [示例2-33]以下将实现一 ...

  8. normalizr实践使用(个人总结,仅供参考)

    # normalizr实践使用 原数据 (自编数据,本数据仅供参考) var aaaObj ={ "id" : "0000000000000000000000000000 ...

  9. linux 输入设备驱动

    <输入子系统简介> a:背景 内核的输入子系统是对“分散的”,“多种不同类别”的输入设备(键盘,鼠标,跟踪杆,触摸屏,加速度计等)进行“统一处理”的驱动程序.具有如下特点: a-1:统一各 ...

  10. python面向对象魔术方法补充

    一.描述符 在 面向对象 编程中 定义一个(没有定义方法)类:class person , 在这个类里面,有name,age, heigth, weight,等等属性, 这个类就可以看作一个对 per ...