当我们在动态地添加一些控件时,在运行过程中会出现以下错误:
java.lang.IllegalStateException:
The specified child already has a parent.
You must call removeView() on the child's parent first.
翻译过来就是这个子控件已经有了一个父控件,我们必须首先在父控件中使用removeView()函数,出现这种错误原因时一个子控件只能有一个父控件,不能有两个子控件有一个相同的父控件,故出现以上错误。
public class LunBoAdapter extends PagerAdapter {
private ArrayList<ImageView> imageViewList;
public LunBoAdapter(ArrayList<ImageView> mImgList){
this.imageViewList = mImgList;
}
// 1. 返回要显示的条目内容, 创建条目
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
// container: 容器: ViewPager
// position: 当前要显示条目的位置 0 -> 4
//newPosition = position % 5
int newPosition = position % imageViewList.size();
ImageView img = imageViewList.get(newPosition);
ViewPager parent = (ViewPager) img.getParent();
if (parent != null) {
parent.removeView(img);
}
// a. 把View对象添加到container中
container.addView(img);
// b. 把View对象返回给框架, 适配器
return img;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
//container.removeView((View)object);
}
@Override
public int getCount() {
return Integer.MAX_VALUE; //返回一个无限大的值,可以 无限循环!!!!!
}
/**
* 判断是否使用缓存, 如果返回的是true, 使用缓存. 不去调用instantiateItem方法创建一个新的对象
*/
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view == o ;
}
}
解决方法:
在instantiateItem方法里面判断父控件是否存在,如果存在就要把之前的子控件给移除掉,然后再添加新的子控件,这样就行了。
public Object instantiateItem(@NonNull ViewGroup container, int position) {
// container: 容器: ViewPager
// position: 当前要显示条目的位置 0 -> 4
//newPosition = position % 5
int newPosition = position % imageViewList.size();
ImageView img = imageViewList.get(newPosition);
ViewPager parent = (ViewPager) img.getParent();
if (parent != null) {
parent.removeView(img);
}
// a. 把View对象添加到container中
container.addView(img);
// b. 把View对象返回给框架, 适配器
return img;
}