ViewPager里面ImageView图片切换出现bug

来源:互联网 发布:维宏股份人工智能 编辑:程序博客网 时间:2024/05/18 02:31

网上有很多怎么使用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


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