今天在项目中发现,ViewPager的内容在动态更新之后,重复点击使用可能出现如题所述的错误,而根据错误日志的描述,错误的根源是在adapter中的instantiateItem()
方法。而该问题的解决办法在StackOverflow中已经有了很好的解释,下面原文搬运如下:
The problem is that in your adapters method instantiateItem
you call container.addView(v);but every View can have only one parent,
so it can be added only one time to a container via addView(…).When you open the popup the first time, everything works, because v
doesn’t have a parent that time. But when you open your popupwinow the second time,
it adds the view again to the container. That cerates the error.Try to destroy the view if you close the popup view or remove all children views from it with
container.removeAllViews()
而默认instantiateItem()
方法中的代码如下:
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(view);
return view;
}
根据上文中的描述,我们在返回view之前做一下处理,代码如下
@Override
public Object instantiateItem(ViewGroup container, int position) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeAllViews();
}
container.addView(view);
return view;
}
防止出现一个view拥有多个parent的情况,即可避免上述错误。