按钮为空对象引用(Android Studio) [英] Button is null object reference (Android Studio)
问题描述
我有一个 recyclerview 和 view holder 来列出我所有来自 firestore 的数据.每个数据都会有一个删除按钮来删除.但是每当我将删除按钮放在 admin
类上时,它都会在空对象引用上显示 void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)'
.但是,如果我将删除按钮放在 view holder
类上,它会起作用.那么如何将删除按钮放在我的 admin class
上?
I have a recyclerview and view holder to list all my data from firestore. Each data will have a delete button to be deleted. But whenever I put the delete button on admin
class, it show me void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
. But if i put delete button on view holder
class it work. So how can i put the delete button on my admin class
?
admin
类
package com.example.sossystem;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.firebase.ui.firestore.FirestoreRecyclerAdapter;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.FirebaseFirestore;
import org.jetbrains.annotations.NotNull;
import org.w3c.dom.Text;
import java.util.ArrayList;
public class admin extends AppCompatActivity {
Button gotoRegister, deletebutton;
FirebaseFirestore db = FirebaseFirestore.getInstance();
RecyclerView mFirestoreList;
CollectionReference query = db.collection("Users");
//recycler options
FirestoreRecyclerOptions<SosRecords> options;
FirestoreRecyclerAdapter<SosRecords,MyViewHolder>adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_admin);
deletebutton = (Button)findViewById(R.id.delete_button);
gotoRegister = findViewById(R.id.gotoRegister);
mFirestoreList = findViewById(R.id.firestore_list);
mFirestoreList.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
mFirestoreList.setHasFixedSize(true);
//register button click event
gotoRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(getApplicationContext(), RegisterOfficer.class));
}
});
ReadData();
}
private void ReadData() {
options = new FirestoreRecyclerOptions.Builder<SosRecords>().setQuery(query,SosRecords.class).build();
adapter=new FirestoreRecyclerAdapter<SosRecords, MyViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull @NotNull MyViewHolder holder, int position, @NonNull @NotNull SosRecords model) {
holder.email.setText(model.getEmailAddress());
holder.name.setText(model.getFullName());
holder.phone.setText(model.getPhoneNumber());
holder.position.setText(model.getPosition());
deletebutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference noteRef = db.collection("Users").document(model.getFirebaseUid());
noteRef.delete().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull @NotNull Task<Void> task) {
if(task.isSuccessful()){
Log.d("TAG","delete"+model.getFirebaseUid());
}
else{
Log.d("TAG","error");
}
}
});
}
});
}
@NonNull
@NotNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_singleofficer,parent,false);
return new MyViewHolder(view);
}
};
adapter.startListening();
mFirestoreList.setAdapter(adapter);
}
public void logoutAdmin(View view) {
FirebaseAuth.getInstance().signOut();
startActivity(new Intent(getApplicationContext(), Login.class));
finish();
}
}
Viewholder 类
Viewholder class
package com.example.sossystem;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QuerySnapshot;
import org.jetbrains.annotations.NotNull;
class MyViewHolder extends RecyclerView.ViewHolder {
TextView name,phone,email,position;
FirebaseAuth fAuth;
FirebaseFirestore fStore;
public MyViewHolder(@NonNull @NotNull View itemView) {
super(itemView);
//firebase auth instances assign
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
name=itemView.findViewById(R.id.name_text);
phone=itemView.findViewById(R.id.surname_text);
email=itemView.findViewById(R.id.email_text);
position=itemView.findViewById(R.id.position_text);
}
}
单个项目的 XML
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="190dp"
android:layout_margin="10dp"
android:padding="20dp"
app:cardCornerRadius="10dp"
app:cardElevation="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">s
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="Email : "
android:textSize="17sp"
android:textStyle="bold" />
<TextView
android:id="@+id/email_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:text="gasg"
android:textSize="17sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="Name : "
android:textSize="17sp"
android:textStyle="bold" />
<TextView
android:id="@+id/name_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:text="gasg"
android:textSize="17sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="Phone : "
android:textSize="17sp"
android:textStyle="bold" />
<TextView
android:id="@+id/surname_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:text="ga"
android:textSize="17sp"
android:textStyle="bold" />
<Button
android:id="@+id/buttonCall"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:text="Call"
android:translationX="70dp" />sg
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="Position : "
android:textSize="17sp"
android:textStyle="bold" />
<TextView
android:id="@+id/position_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:text="ga"
android:textSize="17sp"
android:textStyle="bold" />
</LinearLayout>
<Button
android:id="@+id/delete_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="delete"
android:text="Delete Account"
android:translationX="125dp"
app:backgroundTint="#B84B4B" />
</LinearLayout>
</androidx.cardview.widget.CardView>
推荐答案
在管理类中,您的删除按钮位于 onbindViewHolder
内,您需要将其写为
In Admin Class your delete button is inside onbindViewHolder
you need to write it as
holder.deletebutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick (View v){
//delete
}
});
这篇关于按钮为空对象引用(Android Studio)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!