您的位置:首页 > 其它

ListView的优化

2016-04-13 21:36 316 查看
1. ListView需要设置adapter,它的item是通过adapter的方法getView(int position, View convertView, ViewGroup parent)获得的。

2. ListView中只有第一屏的item需要新建,它的引用会被存在RecycleBin对象内,在拖动时后面的item实际上是重从了之前创建的item。

3. 根据上述,ListView在需要显示item时,最开始第一屏时,getView(int position, View convertView, ViewGroup parent )的第二个参数为null,显示第二屏或者回滚显示第一屏时,getView(int
position, View convertView, ViewGroup parent )第二个参数是一个原来缓存的item,我们只需要在getView中把它内部数据更新即可。

4. 如果item结构比较复杂,在更新一个已有的item内部数据的时候,查找item内部每一个元素也需要占用不少资源,所以,可以把这些内部元素的引用缓存起来,直接对其赋值,最有效的方法是把这些引用存到对应的item中,比较好的方法是使用setTag()方法。

据上四条,可得出:

1. 在adapter的getView(int position, View convertView, ViewGroup parent)方法中,每次都new一个新的View返回,是性能最差的,浪费了ListView巧妙设计的一片苦心。

2. 如果item内部元素简单,getView中如果传进来的view不为空,直接为其赋值即可。

3. 如果item内部元素复杂,可以使用Google IO 大会中讨论的方法优化(如下):
public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder;

if (convertView == null) {

convertView = mInflater.inflate(R.layout.list_item_icon_text, null);

holder = new ViewHolder();

holder.icon1 = (ImageView) convertView.findViewById(R.id.icon1);

holder.text1 = (TextView) convertView.findViewById(R.id.text1);

convertView.setTag(holder);

}

else{

holder = (ViewHolder)convertView.getTag();

}

holder.icon1.setImageResource(R.drawable.icon);

holder.text1.setText(mData[position]);

return holder;

}

static class ViewHolder {

TextView text1;

ImageView icon1;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: