ViewPager里面ImageView图片切换出现bug

网上有很多怎么使用ViewPager和ImageView实现图片滚动显示的例子。这里就不详述了。主要讲一下在项目中出现过的ViewPager显示的图片是两张图片叠加的现象。

 

背景:

因为图片是从网络下载,在下载完成之前,先显示默认图片,下载之后再显示网络上的图片。但是发现某一张图片(一般是第一张或者第二张,其他的显示没有问题)的现象是:默认图片叠加在网络图片之上(也有可能不显示网络图片,因为默认图片和网络图片规格一样,网络图片被覆盖了)。

 

问题:

为什么就一张图片显示问题,其他几张图片没有出现这种情况?

因为ViewPager类似ListView,基于某种性能考虑,刚开始只是初始化了两个View对象,所以才会出现其他的图片没有问题的情况。

 

解题方法:

先查看hierarchyviewer,查看出现问题的时候有几个view在ViewPager对象里面。结果发现果然多了一个View(就是包含默认图片的view)。因为PagerAdapter里面有针对View进行销毁和新建的函数,有可能是没有销毁多余的那个view。

在PagerAdapter的子类中的函数destroyItem改成

public void destroyItem(View arg0, int arg1, Object arg2) { //((ViewPager) arg0).removeView(views.get(arg1));会导致出现背景重叠的现象。因为并没有出去之前//新建的一个对象view ((ViewPager) arg0).removeView((View)arg2); }

其实最开始的原因是因为由于某种原因,PagerView显示了两次,所以创建了两个PagerAdapter实例,所以使用:removeView(views.get(arg1))并不会删除原来的那个绑定的数据源,反而是删除了当前绑定的数据源。所以导致出现该问题。正确的是直接删除需要销毁的Object arg2即可。

 

引申问题:

第一张图片出现右边部分全部是黑色的,一般是从最后一张图片自动滑到第一张图片的时候出现。修改:

iv_1.setBackgroundResource(R.drawable.new_banner); //iv_1.setImageDrawable(getResources().getDrawable(R.drawable.new_banner));//使用这个会导致右边有部分变成黑色,并且看起来像是多了一个view

 

因为有时候需要设置第一张图片不变,其他几张才是从网络下载的,所以会碰到这种情况。直接设置第一张图片为背景即可。

来源:http://blog.csdn.net/murphykwu/article/details/10590381

posted on 2014-01-03 18:41  勤修  阅读(1877)  评论(0编辑  收藏  举报

导航