大概如下图所示的一种需求:整体是一个列表,列表最末尾有一项和其他item略有区别的item。
image.png
刚开始时,由于左侧都是按照图片来加载,并没有出现任何问题。使用Fresco库加载,也不会出现列表滑动时,图片错乱的问题。
然而后续迭代时,需要将图片的背景和icon分离,方便产品配置颜色或者支持主题等。
因此这个ImageView就分为两部分处理,icon部分继续交给Fresco加载,背景部分则需要自己处理。这里是根据图片的url来判断,如果符合要求,则手动构造一个drawable并setBackground()到相关的view当中去。
然而由于listview中,itemview的视图实际上是会被复用的,因此当对其中某些view设置了background后,滑动几次,这个view将可能被复用到各个itemview上,特别的,对于尾部的item,非常容易获取到头部item的缓存视图。即便所有icon都能正常加载,但是item的背景依然会出现复用的情况。
知道问题根源,解决其他就很简单,在adapter的getView方法中,判断当前viewHolder的类型,如果是末尾这种特殊的情况,手动清理view的background即可。
PS:Android view.setBackgroundDrawable()方法已经被设为废弃,而view.setBackGround()方法最小支持sdk 16,项目最低支持sdk 15也是蛋疼。。。