在使用中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的具体执行机制才能避免这类错误再发生。