ViewPager 出现重复添加View问题

在使用中ViewPager和GridView整合做一个自定义UI时,在PagerAdapter重载方法instantiateItem()中出现异常

报错code为:

@Override
		public Object instantiateItem(View arg0, int arg1) {

			((ViewPager) arg0).addView(mListViews.get(arg1), 0); //此句报错。

			return mListViews.get(arg1);

		}

具体问题为:

java.lang.IllegalStateException The specified child already has a parent. You must call removeView() on the child's parent first.

查阅相关信息后发现错误原因为指定要添加的view已经被设置了parent,如果要添加就必须先解除原parent的联系.观察Exception错误栈发现导致这一步是因为ViewPager执行setCurrentItem(index)方法时会间接调用到instantiateItem()方法,具体原因未知。

修改代码,先判断需要添加的view是否有parent再做add操作,bug解除:

@Override
		public Object instantiateItem(View arg0, int arg1) {
			try {
				if(mListViews.get(arg1).getParent()==null){
					((ViewPager) arg0).addView(mListViews.get(arg1), 0);
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return mListViews.get(arg1);

		}

不过这只是暂时的解决方法,还需要再熟悉viewpager的具体执行机制才能避免这类错误再发生。

猜你喜欢

转载自vocaloid.iteye.com/blog/1814627