android - 删除卡片视图 - 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)
解决方案
推荐阅读
- win32com - 如何使用python共享outlook日历
- python - Python 记录器并不总是记录
- jquery - 检查 rel 属性的外部链接并使用“noopener”扩展它
- swift3 - 使用@IBDesignable 设置多个值
- vuejs2 - VueJS:如何在对象上调用数组方法`push`但仍然有效?
- javascript - 使快速端点异步
- c# - Web api windows 授权被拒绝
- mysql - 检查Mysql中记录组的列中不存在的值
- c# - 如何同时提交多个具有共同文件的 VS 解决方案?
- ios - 比较 NSDecimalNumber 和 NSNumber 得到错误的结果