android-PageAdapter';s addView方法引发异常;指定的子项已具有父项。”;

android-PageAdapter';s addView方法引发异常;指定的子项已具有父项。”;,android,android-viewpager,android-view,android-adapter,android-dialog,Android,Android Viewpager,Android View,Android Adapter,Android Dialog,我有一个自定义页面适配器,它是动态的,允许您添加和删除视图。我从中找到了代码 MainPagerAdapter public class MainPagerAdapter extends PagerAdapter { private ArrayList<View> views = new ArrayList<View>(); @Override public int getItemPosition(Object object) {

我有一个自定义页面适配器,它是动态的,允许您添加和删除视图。我从中找到了代码

MainPagerAdapter

public class MainPagerAdapter extends PagerAdapter {
    private ArrayList<View> views = new ArrayList<View>();

    @Override
    public int getItemPosition(Object object) {
        int index = views.indexOf(object);
        if (index == -1)
            return POSITION_NONE;
        else
            return index;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View v = views.get(position);
        container.addView(v);
        return v;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView(views.get(position));
    }

    @Override
    public int getCount() {
        return views.size();
    }


    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }


    public int addView(View v) {
        return addView(v, views.size());
    }


    public int addView(View v, int position) {
        views.add(position, v);
        return position;
    }


    public int removeView(ViewPager pager, View v) {
        for (int i = 0; i < views.size(); i++) {
            if (views.get(i).getTag().equals(v.getTag()))
                return removeView(pager, i);
        }
        return -1;
    }


    public int removeView(ViewPager pager, int position) {
        pager.setAdapter(null);
        views.remove(position);
        pager.setAdapter(this);

        return position;
    }

    public View getView(int position) {
        return views.get(position);
    }
}
此外,这里还有PopupHandler(类填充
查看页面
并添加视图):

公共类PopupHandler{
私人语境;
私有布尔isPopUpShowing;
私有列表类型列表;
私有ViewPager pager=null;
private MainPagerAdapter pagerAdapter=null;
私有视图垂直操作员;
私有文本视图警报号码;
私人AlertDialog AlertDialog;
公共PopupHandler(上下文){
this.context=上下文;
...
}
公共无效手册(IAlarmInfo alarmInfo){
//检查一些圆锥曲线
如果(新警报){
alarmTypeList.add(alarmInfo.getAlarmType());
如果(…){
//第一次创建对话框和添加视图
showDiaog(alarmInfo.getTitle()、alarmInfo.getSummary()、alarmInfo.getAlarmIconResource()、alarmInfo.getAlarmType());
isPopUpShowing=true;
}否则{
//添加视图
视图v=设置视图(alarmInfo.getTitle()、alarmInfo.getSummary()、alarmInfo.getAlarmIconResource()、alarmInfo.getAlarmType());
addView(v);
}
}否则{
if(alarmTypeList.contains(alarmInfo.getAlarmType())){
//删除视图
alarmTypeList.remove(alarmInfo.getAlarmType());
视图v=设置视图(alarmInfo.getTitle()、alarmInfo.getSummary()、alarmInfo.getAlarmIconResource()、alarmInfo.getAlarmType());
移除视图(v);
if(alarmTypeList.size()==0&&alertDialog.isShowing()){
//如果列表为空,则关闭对话框
alertDialog.disclose();
isPopUpShowing=假;
}
}
}
}
私有void showDiaog(最终字符串标题、最终字符串摘要、最终int图标、AlarmType AlarmType){
AlertDialog.Builder dialogBuilder=新建AlertDialog.Builder(新建ContextThemeWrapper(context,R.style.myDialog));
dialogBuilder.setCancelable(false);
LayoutFlater充气机=LayoutFlater.from(上下文);
视图对话框视图=充气机。充气(R.layout.popups\u容器,空);
ButterKnife.bind(这个,dialogView);
pager=(ViewPager)dialogView.findViewById(R.id.popup\u view\u pager);
寻呼机设置适配器(pagerAdapter);
pager.setOffscreenPageLimit(5);
pager.addOnPageChangeListener(新的ViewPager.OnPageChangeListener(){
@凌驾
已滚动页面上的公共无效(int-position、float-positionOffset、int-positionOffsetPixels){
}
@凌驾
已选择页面上的公共无效(内部位置){
Log.i(“测试”、“页面选择”+位置);
alertNumber.setText(“+pagerAdapter.getCount()”的(位置+1)+”号);
}
@凌驾
公共无效onPageScrollStateChanged(int状态){
}
});
alertNumber=(TextView)dialogView.findViewById(R.id.popup\u alert\u number);
alertNumber.setText((alarmTypeList.indexOf(alarmType)+1)+“+alarmTypeList.size()中的“);
VerticallineOperator=dialogView.findViewById(R.id.popup\u vertical\u Separator);
setBackgroundColor(alertNumber.GetTextColor().getDefaultColor());
视图v=设置视图(标题、摘要、图标、报警类型);
pagerAdapter.addView(v,0);
pagerAdapter.notifyDataSetChanged();
dialogBuilder.setView(dialogView);
alertDialog=dialogBuilder.create();
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE\系统\警报);
alertDialog.show();
}
私有视图设置视图(字符串标题、字符串摘要、int图标、AlarmType AlarmType){
视图v1=LayoutFlater.from(上下文)。充气(R.layout.popup,null);
TextView titleText=(TextView)v1.findViewById(R.id.popup_title);
TextView摘要text=(TextView)v1.findViewById(R.id.popup\u摘要);
ImageView图标上下文=(ImageView)v1.findViewById(R.id.popup\u alert\u图标);
titleText.setText(标题);
summaryText.setText(摘要);
setImageResource(图标);
v1.设置标签(报警类型);
返回v1;
}
公共void addView(查看新页面){
int pageIndex=pagerAdapter.addView(newPage);
pagerAdapter.notifyDataSetChanged();
setCurrentItem(pageIndex,true);
}
public void removeView(视图失效页){
int pageIndex=pagerAdapter.removeView(寻呼机,失效页);
//如果当前页面是“defunctPage”,您可能需要选择要显示的页面。
如果(页面索引==-1)
返回;
如果(pageIndex==pagerAdapter.getCount())
页面索引--;
pager.setCurrentItem(页面索引);
alertNumber.setText((pageIndex+1)+“of”+alarmTypeList.size());
}
公共视图getCurrentPage(){
返回pagerDatapter.getView(pager.getCurrentItem());
}
公共无效设置当前页面(查看页面显示){
pager.setCurrentItem(pagerAdapter.getItemPosition(pageToShow),true);
}
public void hidePopup(){
如果(alertDialog!=null)
如果(alertDialog.isShowing()){
alertDialog.disclose();
alarmTypeList.clear();
}
}
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
    View v = views.get(position);
    container.addView(v); // here is the crash
    return v;
}
public class PopupHandler {
    private Context context;
    private boolean isPopUpShowing;
    private List<AlarmType> alarmTypeList;
    private ViewPager pager = null;
    private MainPagerAdapter pagerAdapter = null;
    private View verticalLineSeperator;
    private TextView alertNumber;

    private AlertDialog alertDialog;

    public PopupHandler(Context context) {
        this.context = context;
        ...
    }

 public void handleAlert(IAlarmInfo alarmInfo) {
        // checking some conidtions
        if (newAlarm) {
            alarmTypeList.add(alarmInfo.getAlarmType());
            if (...) {
                // first time creating dialog and adding view
                showDiaog(alarmInfo.getTitle(), alarmInfo.getSummary(), alarmInfo.getAlarmIconResource(), alarmInfo.getAlarmType());
                        isPopUpShowing = true;
           } else {
                    // adding view
                    View v = setUpView(alarmInfo.getTitle(), alarmInfo.getSummary(), alarmInfo.getAlarmIconResource(), alarmInfo.getAlarmType());
                     addView(v);
                  }

        } else {
            if (alarmTypeList.contains(alarmInfo.getAlarmType())) {
                //remove view
                alarmTypeList.remove(alarmInfo.getAlarmType());
                View v = setUpView(alarmInfo.getTitle(), alarmInfo.getSummary(), alarmInfo.getAlarmIconResource(), alarmInfo.getAlarmType());
                removeView(v);
                if (alarmTypeList.size() == 0 && alertDialog.isShowing()) {
                    // if list empty dismiss dialog
                    alertDialog.dismiss();
                    isPopUpShowing = false;
                }
            }
        }
    }

    private void showDiaog(final String title, final String summary, final int icon, AlarmType alarmType) {
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(new ContextThemeWrapper(context, R.style.myDialog));
        dialogBuilder.setCancelable(false);
        LayoutInflater inflater = LayoutInflater.from(context);
        View dialogView = inflater.inflate(R.layout.popups_container, null);
        ButterKnife.bind(this, dialogView);
        pager = (ViewPager) dialogView.findViewById(R.id.popup_view_pager);
        pager.setAdapter(pagerAdapter);
        pager.setOffscreenPageLimit(5);
        pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int position) {
                Log.i("testing", "onPageSelected " + position);
                alertNumber.setText((position + 1) + " of " + pagerAdapter.getCount());

            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
        alertNumber = (TextView) dialogView.findViewById(R.id.popup_alert_number);
        alertNumber.setText((alarmTypeList.indexOf(alarmType) + 1) + " of " + alarmTypeList.size());
        verticalLineSeperator = dialogView.findViewById(R.id.popup_vertical_seperator);
        verticalLineSeperator.setBackgroundColor(alertNumber.getTextColors().getDefaultColor());
        View v = setUpView(title, summary, icon, alarmType);
        pagerAdapter.addView(v, 0);
        pagerAdapter.notifyDataSetChanged();
        dialogBuilder.setView(dialogView);
        alertDialog = dialogBuilder.create();
        alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        alertDialog.show();
    }

    private View setUpView(String title, String summary, int icon, AlarmType alarmType) {
        View v1 = LayoutInflater.from(context).inflate(R.layout.popup, null);
        TextView titleText = (TextView) v1.findViewById(R.id.popup_title);
        TextView summaryText = (TextView) v1.findViewById(R.id.popup_summary);
        ImageView iconText = (ImageView) v1.findViewById(R.id.popup_alert_icon);
        titleText.setText(title);
        summaryText.setText(summary);
        iconText.setImageResource(icon);
        v1.setTag(alarmType);
        return v1;
    }

    public void addView(View newPage) {
        int pageIndex = pagerAdapter.addView(newPage);
        pagerAdapter.notifyDataSetChanged();
        pager.setCurrentItem(pageIndex, true);
    }

    public void removeView(View defunctPage) {
        int pageIndex = pagerAdapter.removeView(pager, defunctPage);
        // You might want to choose what page to display, if the current page was "defunctPage".
        if (pageIndex == -1)
            return;
        if (pageIndex == pagerAdapter.getCount())
            pageIndex--;
        pager.setCurrentItem(pageIndex);
        alertNumber.setText((pageIndex + 1) + " of " + alarmTypeList.size());
    }

    public View getCurrentPage() {
        return pagerAdapter.getView(pager.getCurrentItem());
    }

    public void setCurrentPage(View pageToShow) {
        pager.setCurrentItem(pagerAdapter.getItemPosition(pageToShow), true);
    }


    public void hidePopup() {
        if (alertDialog != null)
            if (alertDialog.isShowing()) {
                alertDialog.dismiss();
                alarmTypeList.clear();
            }
    }
}