场景
为了实现一个订单下多个商品同时评价功能,列表分五种状态(非常满意,满意,一般,较差,不满意)展示,用一个listview,item中有一个GridView,GridView中放置最多五张图片;在listview上下滑动时会出现item中的图片重复、错乱、闪烁等问题。
我的错误
先讲我的错误。遇到问题后Google,参考了一些资料,都是提示要在外层listview的adapter上设置setTag(), 然后在内层GridView的adapter上整体和需要标记复用的imageView上setTag()。照此执行了,还是出错;后来在同事指点下,原来外层adapter中设置gridAdapter时只是在没有塞值时gridView.setVisibility(View.GONE)
,忘了要在有值的时候gridView.setVisibility(View.VISIBLE)
, 所以导致在复用的时候,没有了GridView可复用。
1 | //评价照片 |
教训:这个问题此前已经遇到过,真是不长记性,看来遇到一些常见问题还是要记录下来啊。例如写这个博客。
原因总结
为了提升listview性能,缓存复用了item(某行对应的View),ListView通过getView()获取每行的item。
滑动过程中,a. 如果某行item已经滑出屏幕,若该item不在缓存内,则put进缓存,否则更新缓存;
b. 获取滑入屏幕的行item之前会先判断缓存中是否有可用的item,如果有,做为convertView参数传递给adapter的getView。
- 行item图片显示重复:指当前行item显示了之前某行item的图片。
- 行item图片显示错乱:指某行item显示了不属于该行item的图片。
- 行item图片显示闪烁:上面b的情况,加载缓慢,还没加载完又滑到下一页,下一页某个item又加载出来了,所以导致图片快速覆盖,显示闪烁效果。
解决方法
第一步:ListView Adapter getView写法
1 | @Override |
这里如果写的是convert()方法,则不需要写以上复用,因为父类中会做复用的事。
第二步: GridView gridAdapter getVIew写法
与上面写法类似;不过需要在用到图片的地方进行判断。
1 | @Override |
一般情况下,走完以上两部可解决问题;解决不了的就要仔细检查一下,有没有像我一样的遗漏问题,小心啊,程序员们。
参考
感谢作者们的无私奉献,如有侵权,立马删除。
多做总结,少走老路。多写博客,方便他人。
- 本文作者: Linking
- 本文链接: https://linking.fun/2017/03/29/ListView嵌套GridView显示多张图片出现图片重复、错乱、闪烁等问题/
- 版权声明: 版权所有,转载请注明出处!