从RecyclerView打开Dialog时,onCreate()之前的活动无法使用系统服务

时间:2018-04-25 10:09:23

标签: java android android-recyclerview

我突然发现了这个错误,并且不知道造成它的原因是什么或来自哪里。

基本上我已经获得了RecyclerView,其中包含了产品。选择产品后,我会在用户可以增加产品数量或删除产品的位置弹出自定义Dialog。这一切都有效,但如果我第二次点击相同的产品,它会崩溃应用程序并出现以下错误:

  

onCreate()

之前的活动无法使用的系统服务

这是我的RecyclerView.Adapter onBindViewHolder()

public class OrderAdapter extends RecyclerView.Adapter<OrderAdapter.MyViewHolder>{

@Override
    public void onBindViewHolder(@NonNull OrderAdapter.MyViewHolder holder, int position) {
        final Item Item = ItemList.get(position);


        holder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog = new Dialog(context,R.style.Custom_Theme_Dialog);
                //Code breaks on this line
                dialog.setContentView(R.layout.dialog_cart_edit);
                cartProdDesc = dialog.findViewById(R.id.lblcartProdDesc);
                cartQuantity = dialog.findViewById(R.id.edit_quantity);
                btnDone = dialog.findViewById(R.id.btn_dialog_done);
                btnRemove = dialog.findViewById(R.id.btn_dialog_remove);

                addQuantity = dialog.findViewById(R.id.addition_action);
                minusQuantity = dialog.findViewById(R.id.minus_action);

                cartProdDesc.setText(cartItem.getProductDescription());
                cartPackSize.setText(cartItem.getPackSize());

                addQuantity.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        try{
                            quantity = Integer.parseInt(cartQuantity.getText().toString());
                        } catch (NumberFormatException nf) {
                            Log.e("Number Exception","Number Is Blank");
                            quantity = 0;
                        } catch (Exception e){
                            Log.e("ERROR",e.toString());
                        }
                        cartQuantity.setText(String.valueOf(++quantity));
                    }
                });

                minusQuantity.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        try{
                            quantity = Integer.parseInt(cartQuantity.getText().toString());
                        } catch (NumberFormatException nf) {
                            Log.e("Number Exception","Number Is Blank");
                            quantity = 0;
                        } catch (Exception e){
                            Log.e("ERROR",e.toString());
                        }

                        cartQuantity.setText(String.valueOf(--quantity));
                    }
                });

                btnDone.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        if(cartQuantity.getText().toString().isEmpty() || cartQuantity.getText().toString().equals("0") || cartQuantity.getText().toString().contains("-")){
                            cartQuantity.setError("Enter a valid quantity");
                        } else {
                            newQuantity = cartQuantity.getText().toString();
                            db.updateCartItem(new CartItem(cartItem.getId(),cartItem.getProductCode(),cartItem.getBarcode(),cartItem.getNappiCode(),cartItem.getProductDescription(),cartItem.getPackSize(),newQuantity));
                            updateDataSet();
                            notifyDataSetChanged();
                            dialog.dismiss();
                        }
                    }
                });

                btnRemove.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        DialogInterface.OnClickListener dialogClickListner = new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int which) {
                                switch (which){

                                    case DialogInterface.BUTTON_POSITIVE:
                                        db.deleteCartItem(cartItem.getId());
                                        updateDataSet();
                                        dialog.dismiss();
                                        break;

                                    case DialogInterface.BUTTON_NEGATIVE:
                                        dialog.dismiss();
                                        break;
                                }
                            }
                        };
                        AlertDialog.Builder builder = new AlertDialog.Builder(context);
                        builder.setMessage("Are you sure you want to remove " + cartItem.getProductDescription()).setPositiveButton("Yes",dialogClickListner).setNegativeButton("No",dialogClickListner).show();
                    }
                });
                dialog.show();
            }
        });
    }
}

我有private Dialog dialog;声明在Activity进一步宣布,万一有人想知道。

dialog = new Dialog(context,R.style.Custom_Theme_Dialog);上的代码中断了,但是如果我最后注释掉dialog.show()我没有任何问题,除了对话框没有显示,但这告诉我问题不是&#39; t分配对话框,还是我错在这个思路上?

这是我的 OrderActivity 中的一行代码,我在这里调用了适配器,我从这里发送了上下文。

OrderAdapter = new OrderAdapter(this,ItemList);

这是我的构造函数,我指定Context

public OrderAdapter(Context context, List<CartItem> cartItemList){
    this.context = context;
    this.cartItemList = cartItemList;
}

1 个答案:

答案 0 :(得分:1)

取决于Context来自何处,它可能已被&#34;销毁&#34;当onClick()被调用时(实际上并非如此,因为Dialog持有对它的隐式引用)。在这种情况下,这也是内存泄漏。

我建议您更改以下内容:

@Override
public void onClick(View view) {
    dialog = new Dialog(context, R.style.Custom_Theme_Dialog);

对此:

@Override
public void onClick(View view) {
    dialog = new Dialog(view.getContext(), R.style.Custom_Theme_Dialog);

这样您就可以始终引用与Context相关联的View