java - 回调抛出 NullPointerException( fragment 超出适配器)

标签 java android android-fragments callback android-alertdialog

我正在尝试从我的 AlertDialog 中获取信息。单击我的 recyclerView 中的删除按钮后,系统会询问用户是否确定。如果"is",则应删除所选数据集。与this tutorial我尝试实现回调来获取所需的信息,但总是收到 NullPointerException。我不明白为什么。也许有人可以帮助我提供一些意见?

警报对话框:

public class deleteAlertFragment extends DialogFragment {
    private OnAddFriendListener callback;

    public interface OnAddFriendListener {
        public void onAddFriendSubmit(String friendEmail);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try {
            callback = (OnAddFriendListener) getTargetFragment();
        } catch (ClassCastException e) {
            throw new ClassCastException(
                    "Calling Fragment must implement OnAddFriendListener");
        }
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(R.string.frag_message)
                .setPositiveButton(R.string.frag_ok,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
//ERROR!
                                callback.onAddFriendSubmit("Kartoffel");

                            }
                        })
                .setNegativeButton(R.string.frag_abort,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // User cancelled the dialog
                            }
                        });
        // Create the AlertDialog object and return it
        return builder.create();
    }

}

错误:

07-06 12:11:44.517: E/AndroidRuntime(1325): FATAL EXCEPTION: main
07-06 12:11:44.517: E/AndroidRuntime(1325): Process: com.holg.prinoviskalkulator, PID: 1325
07-06 12:11:44.517: E/AndroidRuntime(1325): java.lang.NullPointerException: Attempt to invoke interface method 'void com.holg.prinoviskalkulator.deleteAlertFragment$OnAddFriendListener.onAddFriendSubmit(java.lang.String)' on a null object reference
07-06 12:11:44.517: E/AndroidRuntime(1325):     at com.holg.prinoviskalkulator.deleteAlertFragment$1.onClick(deleteAlertFragment.java:36)
07-06 12:11:44.517: E/AndroidRuntime(1325):     at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:162)
07-06 12:11:44.517: E/AndroidRuntime(1325):     at android.os.Handler.dispatchMessage(Handler.java:102)
07-06 12:11:44.517: E/AndroidRuntime(1325):     at android.os.Looper.loop(Looper.java:135)
07-06 12:11:44.517: E/AndroidRuntime(1325):     at android.app.ActivityThread.main(ActivityThread.java:5257)
07-06 12:11:44.517: E/AndroidRuntime(1325):     at java.lang.reflect.Method.invoke(Native Method)
07-06 12:11:44.517: E/AndroidRuntime(1325):     at java.lang.reflect.Method.invoke(Method.java:372)
07-06 12:11:44.517: E/AndroidRuntime(1325):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
07-06 12:11:44.517: E/AndroidRuntime(1325):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

RecycleViewAdapter:

public class RecycleViewAdapter extends RecyclerView.Adapter<RecycleViewAdapter.PersonViewHolder> implements OnAddFriendListener{

    public static class PersonViewHolder extends RecyclerView.ViewHolder {

        CardView cv;
        TextView stintDate;
        TextView stintDuration;
        TextView stintStartTime;
        TextView stintWage;
        Button deleteButton;

        PersonViewHolder(View itemView) {
            super(itemView);
            cv = (CardView)itemView.findViewById(R.id.card_view);

            stintDate = (TextView)itemView.findViewById(R.id.txtDate);
            stintStartTime = (TextView)itemView.findViewById(R.id.txtStartTime);
            stintDuration = (TextView)itemView.findViewById(R.id.txtDuration);
            stintWage = (TextView)itemView.findViewById(R.id.txtWage);
            deleteButton = (Button) itemView.findViewById(R.id.back_delete);
        }
    }

    List<Stint> stints;
    Calendar cal;
    DatabaseHandler db;
    int y = 0;

    RecycleViewAdapter(DatabaseHandler db){
        this.stints = db.getAllStintsList();
        this.db = db;
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    @Override
    public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.single_card_layout, viewGroup, false);
        PersonViewHolder pvh = new PersonViewHolder(v);
        return pvh;
    }

    @Override
    public void onBindViewHolder(final PersonViewHolder personViewHolder, final int i) {

        cal = new GregorianCalendar(stints.get(i).year, stints.get(i).month, stints.get(i).day);
        SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy",Locale.GERMAN);

        personViewHolder.stintDate.setText(i+1 + ") " + sdf.format(cal.getTime()));
        personViewHolder.stintStartTime.setText("" + stints.get(i).startTime);
        personViewHolder.stintDuration.setText(stints.get(i).duration + " h");
        personViewHolder.stintWage.setText(String.format("%.2f €",stints.get(i).wage));

        personViewHolder.deleteButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {

                FragmentManager fm = ((Activity) v.getContext()).getFragmentManager();
                deleteAlertFragment dialog = new deleteAlertFragment();
                dialog.show(fm, "mydialog");

                if(y==1){

                db.deleteEntry(stints.get(i).id);
                stints.remove(i);
                notifyDataSetChanged();
                personViewHolder.getAdapterPosition();
                y=0;
                }
            }
        });   
    }

    @Override
    public void onAddFriendSubmit(String friendEmail) {
    y=1;    
    }

    @Override
    public int getItemCount() {
        return stints.size();
    }
}

最佳答案

您已经创建了变量callBack,但尚未创建它应该引用的对象。 尝试: 私有(private) OnAddFriendListener 回调 = new OnAddFriendListener(); 或者无论对象的构造函数是什么。

希望有帮助。

关于java - 回调抛出 NullPointerException( fragment 超出适配器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31246609/

相关文章:

java - Android Gradle 异常 : "Multiple dex files define", exploded-aar 下的重复类

android - 退出动画不起作用; FragmentTransaction 自定义动画不适用于隐藏

android - 指示在 Datatable Flutter 上选择的项目数的文本

Android - 删除 .txt 文件中最后一个不完整的行

Android TextView 文本在运行时不更新

android - 选项卡执行 Android 中下一个 fragment 中存在的代码

android - Backstack android fragment 导航

java - 在Android中使用ArrayAdaptor时,数据不显示

java - 用于处理大量数据的最佳 Java MVC 框架

java - Android RSS 阅读器 - 教程错误