gpt4 book ai didi

java - 从 RecyclerView 打开对话框时,系统服务在 onCreate() 之前对 Activity 不可用

转载 作者:行者123 更新时间:2023-11-30 00:00:31 28 4
gpt4 key购买 nike

我突然遇到了这个错误,不知道是什么原因造成的,也不知道它是从哪里来的。

基本上,我有一个 RecyclerView,其中填充了产品。选择产品后,我会弹出一个自定义 Dialog,用户可以在其中增加产品数量或删除产品。这一切都有效,但是如果我第二次点击同一个产品,它会导致应用程序崩溃并出现以下错误:

System services not available to Activities before onCreate()

这是我的 RecyclerView.AdapteronBindViewHolder()

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 对话框;Activity 上进一步声明,以防有人疑惑。

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

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

OrderAdapter = new OrderAdapter(this,ItemList);

这是我的构造函数,我要在其中分配 Context

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

最佳答案

根据 Context 的确切来源,它可能在调用 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);

这样,您将始终引用与相应的 View 关联的 Context

关于java - 从 RecyclerView 打开对话框时,系统服务在 onCreate() 之前对 Activity 不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50019557/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com