【发布时间】:2019-02-15 12:50:52
【问题描述】:
我在显示我在 RecyclerView 适配器中创建的 MaterialDialog 时遇到问题。我想在回收器视图所在的活动中显示对话框,并且我已经通过了活动上下文,但它总是给我这个异常:
com.afollestad.materialdialogs.MaterialDialog$DialogException: Bad window token, you cannot show a dialog before an Activity is created or after it's hidden.
这是我的 RecyclerView 适配器:
public class AssetsAdapter extends RecyclerView.Adapter<AssetsAdapter.ItemHolder>{
private static final String TAG = "AssetsAdapter";
private ArrayList<Asset> listData;
private Context activityContext;
private MaterialDialog dialog;
public AssetsAdapter(ArrayList<Asset> listData, Context activityContext, UserService userService) {
this.listData = listData;
this.activityContext = activityContext;
}
public AssetsAdapter(Context activityContext) {
this.activityContext = activityContext;
}
@NonNull
@Override
public ItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout_item_assets, parent, false);
return new ItemHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ItemHolder holder, final int position) {
holder.tv_name.setText(listData.get(position).getName());
holder.tv_manufacturer.setText(listData.get(position).getAsset_id());
holder.tv_quantity.setText(listData.get(position).getPurchase_cost());
holder.btn_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showCreateDialog(position);
}
});
holder.btn_edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(activityContext, "Edit", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
if(listData.isEmpty()) return 0;
else return listData.size();
}
public class ItemHolder extends RecyclerView.ViewHolder{
private ImageView iv_asset;
private TextView tv_name;
private TextView tv_manufacturer;
private TextView tv_quantity;
private TextView tv_status;
private ImageButton btn_edit;
private ImageButton btn_delete;
public ItemHolder(View itemView) {
super(itemView);
iv_asset = itemView.findViewById(R.id.iv_asset);
tv_name = itemView.findViewById(R.id.tv_name);
tv_manufacturer = itemView.findViewById(R.id.tv_manufacturer);
tv_quantity = itemView.findViewById(R.id.tv_quantity);
tv_status = itemView.findViewById(R.id.tv_status);
btn_edit = itemView.findViewById(R.id.btn_edit);
btn_delete = itemView.findViewById(R.id.btn_delete);
}
}
private void showCreateDialog(final int id){
Log.i(TAG, "showCreateDialog: called");
MaterialDialog.Builder builder = new MaterialDialog.Builder(activityContext)
.content("Are you sure you want to delete this data?")
.contentGravity(GravityEnum.CENTER)
.autoDismiss(true)
.positiveText("Yes")
.negativeText("No")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
//deleteAsset(id);
}
})
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
// do nothing
}
})
.canceledOnTouchOutside(true);
dialog = builder.build();
dialog.show();
}
}
我认为我已经正确传递了上下文,因为我没有显示敬酒的问题。所以我不确定我做错了什么。任何答案将不胜感激,谢谢。
【问题讨论】:
-
您应该使用回调或接口在适配器中的点击侦听器上创建材质对话框或任何对话框
-
显示您从 Activity 创建适配器对象的代码
标签: android android-recyclerview