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