listview加载机能优化ViewHolder (转)
listview加载机能优化ViewHolder (转)
2012-8-30
在android开辟中Listview是一个很首要的组件,它以列表的情势按照数据的长自适应显现具体内容,用户可以自由的定义listview每一列的布局,但当listview有多量的数据须要加载的时辰,会占领多量内存,影响机能,这时辰就须要按需填充并从头应用view来削减对象的创建。
ListView加载数据都是在public View getView(int position, View convertView, ViewGroup parent) {}办法中进行的(要自定义listview都须要重写listadapter:如BaseAdapter,SimpleAdapter,CursorAdapter的等的getvView办法),优化listview的加载速度就要让convertView匹配列表类型,并最大程度上的从头应用convertView。
getview的加载办法一般有以下三各种体式格式:
最慢的加载体式格式是每一次都从头定义一个View载入布局,再加载数据
ListView加载数据都是在public View getView(int position, View convertView, ViewGroup parent) {}办法中进行的(要自定义listview都须要重写listadapter:如BaseAdapter,SimpleAdapter,CursorAdapter的等的getvView办法),优化listview的加载速度就要让convertView匹配列表类型,并最大程度上的从头应用convertView。
getview的加载办法一般有以下三各种体式格式:
最慢的加载体式格式是每一次都从头定义一个View载入布局,再加载数据
public View getView(int position, View convertView, ViewGroup parent) { View item = mInflater.inflate(R.layout.list_item_icon_text, null); ((TextView) item.findViewById(R.id.text)).setText(DATA[position]); ((ImageView) item.findViewById(R.id.icon)).setImageBitmap( (position & 1) == 1 ? mIcon1 : mIcon2); return item; }
正确的加载体式格式是当convertView不为空的时辰直接从头应用convertView从而削减了很多不须要的View的创建,然后加载数据
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.item, parent,false); } ((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]); ((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap( (position & 1) == 1 ? mIcon1 : mIcon2); return convertView; }
最快的体式格式是定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时从头应用即可
static class ViewHolder { TextView text; ImageView icon; } public View getView(int position,View convertView,ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item_icon_text,parent,false); holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.text); holder.icon = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.text.setText(DATA[position]); holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2); return convertView; }
三种体式格式加载效力对比如下图所示:
申明:上述三个例子代码摘自google 2010 I/O大会
当处理惩罚一些耗时的资料加载的时辰须要做到以下几点,以使你的加载更快更腻滑:
1. 适配器在界面主线程中进行批改
2. 可以在任何处所获取数据但应当在别的一个处所恳求数据
3. 在主界面的线程中提交适配器的变更并调用notifyDataSetChanged()办法
转自:
http://blog.csdn.net/jacman/article/details/7087995
posted on 2012-08-30 15:50 〃ωǒ系﹄条噚氺dē魚ぐ 阅读(209) 评论(0) 编辑 收藏 举报