istview优化带来的view重用怎么解决
2015-11-29 22:47
302 查看
自定义适配器优化:
1)自定义布局中控件的高度绝对不能是内容包裹
wrap_content,应该是匹配父控件或者指定具体的高度。否则在android代码中会测l量该控件的高度,多次调用getView()。
2)利用convertview的重用,判断是否为空, 只有当convertView为空的时候,才去用填充器填充视图 ,如果不为空,则重用该view。因为填充是非常耗时的操作,因为要解析xml文件。
public View getView(int position, View convertView, ViewGroup parent)
{
View v;
if (convertView == null)
{
v = LayoutInflater.from(getApplicationContext()).inflate(
R.layout.item, parent, false);
}
else
{
v = convertView;
}
return v;
}
3)使用自定义内部类保存控件的引用,可以防止图片错误和优化findviewbyid()。
public static class ViewHolder
{
public TextView tv;
public ImageView iv;
public int position;
}
if (convertView == null)
{
v = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, parent, false);
//优化第三步
//利用ViewHolder保存控件的引用
// 因为不论何时,在同一个ViewGroup中findViewById()去找 , 同一个控件,找到的对象是同一个。
ViewHolder vh = new ViewHolder();
vh.tv = (TextView) v.findViewById(R.id.text);
vh.iv = (ImageView) v.findViewById(R.id.img);
v.setTag(vh);
}
else
{
v = convertView;
}
ViewHolder vh = (ViewHolder) v.getTag();
所以不应该在if语句外findViewById(),那样会多次执行不必要的find。
4)防止图片错位,因为多线程中,图片下载的事件不确定,当图片下载没完成时用户把屏幕滑动出去,而且因为convertview重用,所以有可能其他位置已经改变了该convertview的属性,如位置等。然后下载完的内容就放在了错误的位置。
1)自定义布局中控件的高度绝对不能是内容包裹
wrap_content,应该是匹配父控件或者指定具体的高度。否则在android代码中会测l量该控件的高度,多次调用getView()。
2)利用convertview的重用,判断是否为空, 只有当convertView为空的时候,才去用填充器填充视图 ,如果不为空,则重用该view。因为填充是非常耗时的操作,因为要解析xml文件。
public View getView(int position, View convertView, ViewGroup parent)
{
View v;
if (convertView == null)
{
v = LayoutInflater.from(getApplicationContext()).inflate(
R.layout.item, parent, false);
}
else
{
v = convertView;
}
return v;
}
3)使用自定义内部类保存控件的引用,可以防止图片错误和优化findviewbyid()。
public static class ViewHolder
{
public TextView tv;
public ImageView iv;
public int position;
}
if (convertView == null)
{
v = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, parent, false);
//优化第三步
//利用ViewHolder保存控件的引用
// 因为不论何时,在同一个ViewGroup中findViewById()去找 , 同一个控件,找到的对象是同一个。
ViewHolder vh = new ViewHolder();
vh.tv = (TextView) v.findViewById(R.id.text);
vh.iv = (ImageView) v.findViewById(R.id.img);
v.setTag(vh);
}
else
{
v = convertView;
}
ViewHolder vh = (ViewHolder) v.getTag();
所以不应该在if语句外findViewById(),那样会多次执行不必要的find。
4)防止图片错位,因为多线程中,图片下载的事件不确定,当图片下载没完成时用户把屏幕滑动出去,而且因为convertview重用,所以有可能其他位置已经改变了该convertview的属性,如位置等。然后下载完的内容就放在了错误的位置。
相关文章推荐
- 《构建之法》读书笔记3
- Unity网格合并_材质合并[转]
- Droppable(放置)组件
- LeetCode -- Minimum Depth of Binary Tree
- Eclipse开发C/C++ 安装配置图文详解
- 程序员瞎扯,扯得很有道理
- codeforces 601C (概率DP)
- Object Detection Networks on Convolutional Feature Maps
- LeetCode -- Maximum Subarray
- Matlab的plot~各种颜色和线形
- Java中一些常用的正则表达式
- linux 查找svn相关目录
- Linux内核之中断初探
- Linux configure 参数解释
- Git冲突处理的一些经验
- WebKit之addToJavaScriptWindowObject()分析
- jqgrid引用
- Merge Intervals
- PAT甲级1001
- 开源项目9GAG源码解析与Material改造(三)