Android ListView自动关闭,弹出异常:You must call removeView() on the child's parent first.

异常情况

当点击第二次弹出对话框时,会退出Android程序,出现以下异常
在这里插入图片描述

在这里插入图片描述

解决方法

@Override
    public void onItemClick(final AdapterView<?> parent, View view, final int position, long id) {

        final AlertDialog ad = new AlertDialog.Builder(getActivity()).setView(dialog_buy).create();
        ad.show();

        Button btn_yes = dialog_buy.findViewById(R.id.yes);
        Button btn_no = dialog_buy.findViewById(R.id.no);

        //确定按钮
        btn_yes.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获取数据集合
                List<Map<String,Object>> list = dao.PfindAll();
                //获取当前价格信息
                HashMap<String,Object> map = (HashMap<String, Object>) list.get(position);

                int price = (int) map.get(Constants.PROP_PRI);
                //获取总积分信息
                int num = Integer.parseInt((String)pp.getText());
                //判断是否有足够的积分
                if(price>num){
                    //积分不够,提示信息
                    Toast.makeText(getActivity(),"您的积分不足",Toast.LENGTH_SHORT).show();
                }
                else {
                    //满足购买条件
                    //扣除积分
                    num -= price;

                    //分数设置
                    pp.setText(String.valueOf(num));
                    sp.setText(String.valueOf(num));

                    int cc = listView.getChildCount();                                //获取可见的模块个数
                    int pnum = Integer.parseInt((String) map.get(Constants.PROP_NUM));//目前拥有当前道具的数量
                    pnum++;              //数量+1

                    if (position < cc - 1) {
                        //可见时,修改页面编号,不在可见度内,数据会自动刷新
                        LinearLayout ll = (LinearLayout) listView.getChildAt(position);
                        TextView tv = ll.findViewById(R.id.ppnum);
                        tv.setText(pnum + "");
                    }

                    //获取列表中的数据集合
                    MyAdapter adapter = (MyAdapter) listView.getAdapter();
                    List<Map<String, Object>> la = adapter.getList();
                    //写入list集合
                    la.get(position).put(Constants.PROP_NUM, pnum);

                    //写回数据库
                    ContentValues values = new ContentValues();
                    values.put(Constants.PRI_POI, num);
                    dao.Update(Constants.PRI_TNAME, values);

                    values.clear();
                    values.put(Constants.PROP_NUM, pnum);
                    dao.Update(Constants.PROP_TNAME, values, Constants.PROP_ID + "=?", new String[]{(position + 1) + ""});

                    //在对话框关闭时,移除它的父视图
                    ((ViewGroup)dialog_buy.getParent()).removeView(dialog_buy);

                    //窗口关闭
                    ad.dismiss();
                }

            }
        });

        //取消按钮
        btn_no.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //在对话框关闭时,移除它的父视图
                ((ViewGroup)dialog_buy.getParent()).removeView(dialog_buy);

                ad.dismiss();
            }
        });

    }

重点:在每次关闭对话框时,移除父视图。

((ViewGroup)dialog_buy.getParent()).removeView(dialog_buy);

其中dialog_buy是自定义对话框的xml视图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值