关于GridView加载和滑动时造成的图片混乱问题总结
来源:互联网 发布:壁虎数据恢复 编辑:程序博客网 时间:2024/06/03 13:05
if(!viewMap.containsKey(position) || viewMap.get(position) == null){ holder = new Holder(); convertView = LayoutInflater.from(mContext).inflate(R.layout.host_grid_item, null); holder.imageview = (ImageView) convertView.findViewById(R.id.wallpaper_host_image); convertView.setTag(holder); viewMap.put(position, convertView); }else{ convertView = viewMap.get(position); holder = (Holder) convertView.getTag(); }
最近项目遇到一个BUG,是应用GridView加载图片,会出现图片重复加载的情况,还有滑动的时候下面的图片也会重复。
跟代码会发现getView方法中position=0时会重复加载很多次,并且当position=0时convertView对象会有不同,在网上搜索了一下原因,
总结起来就是如果GridView的宽度高度不确定,getView会多执行几次position=0来计算item的高度和宽度,得出每屏幕能够显示最大的item,
同时也给出了两个解决方案:一是将GridView设置固定宽高或者设置为宽高属性设置为match_parent,这个方法可以解决问题,但是我觉得
不具备通用性;二是下面的方法
if(parent.getChildCount() == position){//正常的position,执行代码}else{//无效的可以忽略}经过笔者测试初始化的时候是会没有问题,但是滚动后数据就会出现问题,所以这个也不能解决问题。
经过笔者总结可以使用另一种方法:笔者或者我们通常为了提高getView效率会向如下这么写
if (convertView == null) {holder = new Holder();convertView = LayoutInflater.from(mContext).inflate(R.layout.host_grid_item, null);holder.imageview = (ImageView) convertView.findViewById(R.id.wallpaper_host_image);convertView.setTag(holder);}else {holder = (Holder) convertView.getTag();}
这就导致了有些convertView会被不同的position使用,导致图片会重复加载,下面提供一个解决方案:
先定义一个Map
private HashMap<Integer, View> viewMap;然后使用下面的方法存储convertView,使其和position一一对应,保证不会出现不同position使用同一convertView对象
if(!viewMap.containsKey(position) || viewMap.get(position) == null){ holder = new Holder(); convertView = LayoutInflater.from(mContext).inflate(R.layout.host_grid_item, null); holder.imageview = (ImageView) convertView.findViewById(R.id.wallpaper_host_image); convertView.setTag(holder); viewMap.put(position, convertView); }else{ convertView = viewMap.get(position); holder = (Holder) convertView.getTag(); }然后为了保证Map不会因为存储过多而溢出,在加上一个清理屏幕范围外的view
if(viewMap.size() > 20){synchronized (convertView) {for(int i = 1;i < mGridview.getFirstVisiblePosition() - 3;i ++){viewMap.remove(i);}for(int i = mGridview.getLastVisiblePosition() + 3;i < getCount();i ++){viewMap.remove(i);}}}
这样就解决了这个问题,本人测试使用没有问题,记录下来仅供以后查看,写的不好多多包含。
3 0
- 关于GridView加载和滑动时造成的图片混乱问题总结
- 关于GridView加载和滑动时造成的图片混乱问题总结
- 关于GridView加载和滑动时造成的图片混乱问题总结
- GridView加载图片混乱
- 在使用Recyclerview加载列表圆形图片时出现的滑动卡顿及图片混乱问题
- 关于listview上下滑动imageview图片混乱问题
- 滑动 CollectionView 图片混乱问题
- 关于加载图片造成oom问题
- 关于ListView滑动混乱问题
- ListView、GridView滑动时禁止加载图片
- 使用Glide加载图片时出现条纹和颜色混乱
- 关于ListView异步加载图片导致图片显示混乱以及ListView效率问题探讨
- ListView异步加载图片混乱问题
- GridView加载大量图片卡的问题
- 解决imageView加载图片时候造成内存溢出的问题
- android 关于 ScrollView嵌套GridView,ListView 显示和滑动的问题
- android 关于 ScrollView嵌套GridView,ListView 显示和滑动的问题
- android 关于 ScrollView嵌套GridView,ListView 显示和滑动的问题
- 易飞ERP对账教材.rar
- Asterisk的進階功能:轉接、代接和會議室
- 正则表达式
- 国外程序员推荐:每个程序员都应读的书
- hduoj1099!【数学】
- 关于GridView加载和滑动时造成的图片混乱问题总结
- Swap Nodes in Pairs
- 代码托管(Git、Github)_store1
- POJ 3094 Quicksum
- HDU-1233 -还是畅通工程 -最小生成树
- Android中Context详解
- 成为优秀程序员的十个有效方法
- Linux Find 时间命令
- Android之基于XMPP协议即时通讯软件(二)