listview优化带来的view重用怎么解决

 我来答
岌岌可危1
2014-01-13 · TA获得超过236个赞
知道答主
回答量:35
采纳率:0%
帮助的人:43.5万
展开全部
自定义适配器优化:

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的属性,如位置等。然后下载完的内容就放在了错误的位置。
chenqijun551
2014-01-07 · TA获得超过120个赞
知道答主
回答量:64
采纳率:0%
帮助的人:46.7万
展开全部
直接用getView方法里面的convertView就好了,if(convertView!=null){convertView=context.getLayoutInflater().inflate(R.layout,layout1,null);}else{} 然后用ViewHolder携带控件在每个item里重用。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式