`
zhuqiang5138
  • 浏览: 30578 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

ListView刷新慢 注意点

阅读更多
Adapter是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View。如果列表中有很多的项时会占用极大的系统资源,所以我们需要优化Adapter

1、convertView的使用
public View getView(int position, View convertView, ViewGroup parent) {  
	ViewHolder holder;  
	if (convertView == null) 
	{  
		//加载ListView item的布局文件
		convertView = mInflater.inflate(R.layout.list_item_icon_text, null);  
		holder = new ViewHolder();  
		holder.text = (TextView) convertView.findViewById(R.id.text);  
		holder.icon = (ImageView) convertView.findViewById(R.id.icon); 
		/**
		 * 利用holder,调用convertView.setTag函数
		 * 使得convertView创建的内存地址,不为空。
		 * 然后调用getTag来获得当前位置的tag
		 * 最后利用holder的各种set操作来替换当前位置的tag。
		*/
		convertView.setTag(holder);  
	} 
	else 
	{  
		holder = (ViewHolder) convertView.getTag();  
	}  
		holder.text.setText(DATA[position]);  
		holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);  
		return convertView;  
	}  
	static class ViewHolder {  
		private TextView text;  
		private ImageView icon;  
	} 

        上面这种方式对于每个View使用了一个ViewHolder来控制其内部的子item还使用了setTag和getTag的方法 将holder绑定到了view上而不是直接的新建View 是对Adapter的优化。

2、测试getView被调用的次数
        假设做一个动态刷新的ListView,发现显示的adapter.notifyDataSetChanged()的速度有点慢 那么可以测试下getView调用的次数 是不是太多。调用的次数多的让你觉着莫名其妙 那么说明 肯定是有问题的 一定会影响性能的。
更改方法:
<ListView android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />

将android:layout_height="wrap_content"修改成:android:layout_height="fill_parent"就可以了。
如果更改以后没用,ListView周围的控件也是"wrap_content"那么也需要修改。

3、关于ListView 对于纯色的item背景 其实可以直接设置BackgroundColor 而不要使用图片 这一部分其实可以有不小的提升 同样的 对于任何纯色的背景 应该尽量去设置RGB颜色 而不是全用一张图片做背景。

参考:http://johncookie.iteye.com/blog/1250049
            http://stephen830.iteye.com/blog/1141532
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics