Android
发布时间:2022-04-28 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android Listview 滑动过程中提示图片重复错乱的原因及解决方法,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
197_0@主要分析Android中Listview滚动过程造成的
图片显示重复、错乱、闪烁的原因及
解决方法,顺
便跟进Listview的缓存机制。
@H_
197_0@
1、原因分析
@H_
197_0@Listview item 缓存机制:为了使得
性能更优,Listview会缓存行item(某行对应的view)。listview通过adapter的getview
函数获得每行的item。滑动过程中,
@H_
197_0@a、如果某行item已经划出屏幕,若该item不在缓存内,则put进缓存,否则更新缓存;
@H_
197_0@b、
获取滑入屏幕的行item之前会先判断缓存中是否有可用的item,如果有,作为convertview参数传递给adapter的getview。
@H_
197_0@这样的话如下的getview写法就可以充分利用缓存大大提升listview的
性能。即
便上万个行item,最多inflate的
次数为n,n为一屏最多
显示listview行item的个数。
@Override
public View getView(int position,View convertView,ViewGroup parent){
ViewHolder holder;
if(convertView == null){
convertView = inflater.inflate(R.layout.list_item,null);
holder = new ViewHolder();
....convertView.setTag(holder);
}else{
holder = (ViewHolder)convertView.getTag();
}
}
@H_
197_0@这样提升了
性能,
但同时造成了一些问题。
@H_
197_0@a、行item
图片显示重复
@H_
197_0@这个
显示重复是指当前行item
显示了之前某行item的
图片
@H_
197_0@比如listview滑动到第二行会异步加载某个
图片,但是加载很慢,加载过程中listview已经加载到15行,且滑动过程中该
图片加载结束,第二行 已经不再屏幕内,根据上面介绍的缓存原理,第二行的view可能被第14行服用,这样我们看到的就是14行
显示了本该属于第二行的
图片,造成重复。
@H_
197_0@b、行item
图片显示错乱
@H_
197_0@这个
显示错乱是指某行item
显示了不属于该行item的
图片。
@H_
197_0@比如listview滑动到第二行会异步加载某个
图片,但是加载很慢,加载过程中listview已经滑动到14行,第二行已经不再屏幕内,根据上面介绍 的缓存原理,第二行的view可能被第14行的复用,第十四行
显示了第二行的view这时之前的
图片加载结束,就会
显示在第14行,造成混乱。
@H_
197_0@c、行item图品
显示闪烁
@H_
197_0@上面b情况,14行
图片又很快加载结束,所以我们看到第14行先
显示了第二行的
图片,马上又
显示了自己的
图片进行覆盖造成的闪烁错乱。
@H_
197_0@
2、解决方法
@H_
197_0@通过上面的分析我们知道了出现错乱的原因是异步加载及对象被复用造成的,如果每次getview能给对象
一个标识,在异步加载完成时比较标识与当前的item的标识是否是
一致的,
一致的则
显示,否则不做处理
即可。
@H_
197_0@
代码中
加上
@Override
public View getView(int position,null);
holder = new ViewHolder();
....convertView.setTag(holder);
}else{
holder = (ViewHolder)convertView.getTag();
}
。。。。。
imageview.setTag(imageurl);
if(!cache.icon_catch.get(imageurl,imageview){
imageview.setimageDrawable(null);
}
}
@H_
197_0@其中setTag表示设置标识,方
便下面进行标志比对
if ( ! Cache . ICON_CACHE . get ( imageUrl,imageView ) )
@H_
197_0@Cache.ICON_CACHE为ImageCache的实例,表示如果不在缓存内则设置drawable为null(当然你可以可以设置为你自己的
默认资源),防止
显示了之前某个行item的
图片,
解决了a. 行item
图片显示重复问题。
@H_
197_0@在ImageCache的OnImageCall
BACkListener的onImageLoaded
函数中
添加
@H_
197_0@Java
public void onImageLoaded ( String imageUrl,Drawable imageDrawable,View view,BooleanisInCache ) {
// can be another view child,like textView and so on
if ( view != null && imageDrawable != null ) {
ImageView imageView = ( ImageView ) view ;
// add tag judge,avoid listView cache and so on
String imageUrlTag = ( String ) imageView . getTag ( ) ;
if ( ObjectUtils . isEquals ( imageUrlTag,imageUrl ) ) {
imageView . setImageDrawable ( imageDrawable ) ;
}
}
} ;
@H_
197_0@在上面用
String imageUrlTag = (
String)imageView.getTag(
);取得之前设置的tag,然后和当前的url进行比较,如果相等则
显示,
解决了b. 行item
图片显示错乱,c. 行item
图片显示错乱的两个问题。其中Ob
jectUtils可见Ob
jectUtils@Github .
@H_
197_0@其他异步加载过程
解决原理类似。
@H_
197_0@以上所述是小编给大家介绍的Android Listview 滑动过程中
提示图片重复错乱的原因及
解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时
回复大家的。在此也非常感谢大家对编程小技巧网站的
支持!
大佬总结
以上是大佬教程为你收集整理的Android Listview 滑动过程中提示图片重复错乱的原因及解决方法全部内容,希望文章能够帮你解决Android Listview 滑动过程中提示图片重复错乱的原因及解决方法所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。