深入理解ViewHolder
来源:互联网 发布:419是什么意思网络用语 编辑:程序博客网 时间:2024/05/22 04:36
深入理解ViewHolder
ListView和GridView应该是我们Android开发中最常见的控件了,我们几乎每天都需要和他们打交道。
作为最常见的信息展示布局,我们每次使用都会进行一下几步,建立Adapter,设置getView() getCount()方法等等。
getView()在Adapter数据和我们的视图文件之间建立关系,是最重要的方法。
常见的写法
利用Android的Recycler机制,利用convertView来重新回收View,效率有了本质提高。View的每次创建是比较耗时的,因此对于getview方法传入的convertView应充分利用 != null的判断 。
@Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(context); View v; Log.i(TAG, "getView()" + position); if (convertView == null) { // 若为空,则动态加载一个View v = inflater.inflate(R.layout.list_item, null); } else { v = convertView; } mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader); TextView mTextView = (TextView) v.findViewById(R.id.item_text); mTextView.append("------>" + position); return v; }*/ }
ViewHolder
ViewHolder将需要缓存的view封装好,convertView的setTag才是将这些缓存起来供下次调用。 当你的listview里布局多样化的时候 viewholder的作用体现明显,效率再一次提高。 View的findViewById()方法也是比较耗时的,因此需要考虑只调用一次,之后就用View.getTag()方法来获得ViewHolder对象。
最重要的就是减少了findViewById()方法的调用,保证可以重用的convertView中的组件不需要再次findViewById(),每个重用组件只需要findViewById()一次即可。而像上面那种,对于每次调用getView()则必定需要进行一次findViewById()的调用!
@Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(context); ViewHolder viewHolder=null; Log.i(TAG, "getView()" + position); if (convertView == null) { // 若为空,则动态加载一个View convertView = inflater.inflate(R.layout.list_item, null); //ViewHolder初体验 viewHolder=new ViewHolder(); //减少findViewById()的执行 /*不需要每次调用getView()方法就必定调用findViewById()*/ viewHolder.mNetworkImageView=(NetworkImageView) convertView.findViewById(R.id.item_image); viewHolder.textview=(TextView) convertView.findViewById(R.id.item_text); convertView.setTag(viewHolder); } else { /*viewHolder通过getTag()完成初始化*/ viewHolder = (ViewHolder)convertView.getTag(); } String IMAGE_URL = paths[position]; Log.i("MainActivity", "加载图片-------->"+position+"------>"+IMAGE_URL); /*对于视图组件的内容设置需要在if else 外面*/ viewHolder.mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader); viewHolder.textview.append("------>" + position); return convertView; }
静态ViewHolder类
public static class ViewHolder{ public NetworkImageView mNetworkImageView; public TextView textview; }
0 0
- 深入理解ViewHolder
- Android-ViewHolder学习理解
- ViewHolder
- ViewHolder
- ViewHolder
- ViewHolder
- viewholder
- ConvertView和ViewHolder的个人理解
- 对convertView和ViewHolder的理解
- 深入理解
- listview自定义Adapter中重写getview深入了解--convertView ViewHolder
- 深入了解ListView工作原理(一) -- 之viewHolder优化篇
- BaseAdapter的getView()与ViewHolder的两种写法-更深刻理解ViewHolder
- 理解用setTag 和 Viewholder 来优化listView
- MapReduce理解-深入理解MapReduce
- 深入理解动态库
- 深入理解sizeof
- 深入理解MIDlet类
- 树形图计数 count题解
- gcc 和 arm-linux-gcc 编译器的默认搜索头文件路径
- Codeforces Round #319 (Div. 1) 简要记录
- 《活着中文版自序》感悟
- struts2 - There is no Action mapped for namespace [/login] and action name [login!loginInput] ...
- 深入理解ViewHolder
- excel中一列为公式计算得到的为文本,文本改为数值方法
- Git 中一些问题 : refusing to update checked out branch
- HDU 1261
- 5块钱买了个域名之后
- 在 ubuntu 14.04 上安装 YouCompleteMe( 自己看的操作笔记, 路人请勿看, 避免浪费时间 )
- HDU 2401:Baskets of Gold Coins
- iOS 获取一个类的所有方法
- Linux系统函数write说明