首页 > 解决方案 > 删除卡片视图 - Firebaserecycleradapter

问题描述

我正在尝试通过按删除按钮来删除卡片视图。但是,当我调用 mDatabase.child(taskid).removeValue() 时,firebase 中的任务消失了,但我的应用程序崩溃并抛出 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object. toString()' 在空对象引用上。我怎么能纠正这个?

在此处输入图像描述

public class TaskFragment extends Fragment {

    private RecyclerView mTaskList;
    private DatabaseReference mDatabase;


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_task,container,false);
        String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
        Log.i("uid", uid);
        mDatabase = FirebaseDatabase.getInstance().getReference().child("User").child(uid).child("tasks");
        // mDatabase.keepSynced(true);
        mTaskList = (RecyclerView)view.findViewById(R.id.recycleview);
        mTaskList.setHasFixedSize(true);
        mTaskList.setLayoutManager(new LinearLayoutManager(this.getContext()));



        FirebaseRecyclerAdapter<Task, TaskViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Task, TaskViewHolder>
                (Task.class, R.layout.my_tasks, TaskViewHolder.class, mDatabase){
            @Override
            protected void populateViewHolder(final TaskViewHolder viewHolder, final Task task, int position) {
                final String taskid = getRef(position).getKey();
                Log.i("taskid", taskid);
                mDatabase.child(taskid).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        final String description = dataSnapshot.child("description").getValue().toString();
                        final String timestamp = dataSnapshot.child("timestamp").getValue().toString();
                        final String timedue = dataSnapshot.child("timedue").getValue().toString();
                        final String img = dataSnapshot.child("img").getValue().toString();
                        final String type = dataSnapshot.child("type").getValue().toString();
                        final String status = dataSnapshot.child("status").getValue().toString();
                        viewHolder.setDescription(description);
                        viewHolder.setTimetamp(timestamp);
                        viewHolder.setTimedue(timedue);
                        viewHolder.setOfferType(type);
                        viewHolder.setTaskDp(img);
                        viewHolder.setButton().setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                AlertDialog.Builder builder1 = new AlertDialog.Builder(TaskFragment.this.getActivity());
                                builder1.setMessage("Are you sure you want to delete the entry?");
                                builder1.setCancelable(true);
                                builder1.setPositiveButton(
                                        "Yes",
                                        new DialogInterface.OnClickListener() {
                                            public void onClick(DialogInterface dialog, int id) {
                                                dialog.cancel();
                                                mDatabase.child(taskid).removeValue();
                                            }
                                        });

                                builder1.setNegativeButton(
                                        "No",
                                        new DialogInterface.OnClickListener() {
                                            public void onClick(DialogInterface dialog, int id) {
                                                dialog.cancel();
                                            }
                                        });

                                AlertDialog alert11 = builder1.create();
                                alert11.show();
                            }
                        });
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });

            }

        };

        mTaskList.setAdapter(firebaseRecyclerAdapter);
        return view;
    }


    public static class TaskViewHolder extends RecyclerView.ViewHolder{
        View mView;
        public TaskViewHolder(View itemView){
            super(itemView);
            mView = itemView;
        }
        public void setDescription(String desciption){
            TextView task_description = (TextView)mView.findViewById(R.id.task_description);
            task_description.setText(desciption);
        }
        public void setTimetamp(String time){
            TextView task_timestamp = mView.findViewById(R.id.task_timestamp);
            task_timestamp.setText(time);
        }

        public void setTimedue(String time){
            TextView task_timedue = mView.findViewById(R.id.task_timedue);
            task_timedue.setText(time);
        }

        public void setOfferType(String type){
            TextView task_offertype = mView.findViewById(R.id.task_offertype);
            task_offertype.setText(type);
        }

        public void setTaskDp(String img) {
            CircleImageView task_profilePic = mView.findViewById(R.id.task_dp);
            if (img.equals("default")) {
                task_profilePic.setImageResource(R.mipmap.ic_launcher);
            } else {
                Glide.with(mView.getContext()).load(img).into(task_profilePic);
            }
        }

        public Button setButton(){
            Button deleteTask = mView.findViewById(R.id.deleteTask);
            return deleteTask;
        }

    }

}
2019-11-14 13:25:02.081 3891-3891/com.example.onmyway E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.onmyway, PID: 3891
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
        at com.example.onmyway.ui.task.TaskFragment$1$1.onDataChange(TaskFragment.java:73)
        at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.2.0:75)
        at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.2.0:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.2.0:55)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6938)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

标签: androidfirebaseandroid-fragments

解决方案


推荐阅读