深入理解ViewHolder
2015-09-18 17:24
309 查看
深入理解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; }
相关文章推荐
- QT5.5.0 VS2013/CentOS 7自编译
- ThreadLocal是否会引发内存泄露的分析(转)
- JS实现兼容性好,带缓冲的动感网页右键菜单效果
- MAC使用Parallels克隆虚拟机网络不可用的解决方法
- Codeforces Round #319 (Div. 1) 简要记录
- 合并分支
- 网络协议
- linux下编译安装ffmpeg
- 图片始终相对于外层DIV居中
- linux下分卷压缩,合并解压的3种方法
- 树形图计数 count题解
- 细数十大你不得不用的MySQL开发工具(1)
- PHP安装扩展mcrypt以及相关依赖项 【PHP安装PECL扩展的方法】
- ios9学习系列:UIStackView
- Java NIO
- O2O的六种死法
- android源码开发之监听来电状态
- 洗牌与排序
- transitionFromViewController方法的使用--优化
- ServletContextListener监听+Thread使用