Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 除最后一个对象外,RecyclerView在删除对象时更新视图_Java_Android_Firebase Realtime Database_Arraylist_Android Recyclerview - Fatal编程技术网

Java 除最后一个对象外,RecyclerView在删除对象时更新视图

Java 除最后一个对象外,RecyclerView在删除对象时更新视图,java,android,firebase-realtime-database,arraylist,android-recyclerview,Java,Android,Firebase Realtime Database,Arraylist,Android Recyclerview,在我的应用程序中,我有一个活动,在RecyclerView中显示学生的数组列表。学生存储在Firebase实时数据库中。用户可以添加或删除学生。当用户删除一名学生时,RecyclerView将更新并显示剩余的学生 但我有个问题。例如,假设我有5个学生。我想删除所有5个,所以我一个接一个地删除它们。4名学生正确删除,RecyclerView更新并反映了这一点。只有当我删除最后一个学生时,RecyclerView才会更新,学生卡视图才会保留在那里。我收到一条祝酒词,确认该学生已被删除,我可以看到他们

在我的应用程序中,我有一个活动,在RecyclerView中显示学生的数组列表。学生存储在Firebase实时数据库中。用户可以添加或删除学生。当用户删除一名学生时,RecyclerView将更新并显示剩余的学生

但我有个问题。例如,假设我有5个学生。我想删除所有5个,所以我一个接一个地删除它们。4名学生正确删除,RecyclerView更新并反映了这一点。只有当我删除最后一个学生时,RecyclerView才会更新,学生卡视图才会保留在那里。我收到一条祝酒词,确认该学生已被删除,我可以看到他们已在数据库中被删除。如果我导航回仪表板并返回学生列表,则CardView将消失。奇怪

每次删除后,我都会再次尝试调用onStart,但这没有帮助。有什么想法吗

我的活动:

public class StudentListActivity extends AppCompatActivity {

//firebase auth
private FirebaseAuth mAuth;

//public variables
public String currentUserAccount;
public String teacherAccountNav = "Teacher";
public String currentUserId;

//recyclerView variables
DatabaseReference ref;
ArrayList<Student> list;
RecyclerView recyclerView;
SearchView searchView;

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_student_list);

    //get current user
    mAuth = FirebaseAuth.getInstance();
    FirebaseUser user = mAuth.getCurrentUser();
    //assert current user is not null and get current users id
    assert user != null;
    currentUserId = user.getUid();

    //getting firebase reference of current users students
    ref = FirebaseDatabase.getInstance().getReference().child("students").child(currentUserId);

    //initialise views
    recyclerView = findViewById(R.id.rv);
    recyclerView.setHasFixedSize(true);
    searchView = findViewById(R.id.searchView);

}

@Override
protected void onStart() {
    super.onStart();
    if(ref != null){
        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                //add students from firebase to an array list
                if(dataSnapshot.exists()){
                    list = new ArrayList<>();
                    for(DataSnapshot ds : dataSnapshot.getChildren()){
                        list.add(ds.getValue(Student.class));
                    }

                    //sort by name
                    Collections.sort(list, Student.myName);

                    //make recycler view
                    recyclerView.setLayoutManager(new LinearLayoutManager(StudentListActivity.this));
                    StudentAdapterClass studentAdapterClass = new StudentAdapterClass(list);
                    recyclerView.setAdapter(studentAdapterClass);

                    //click listeners for buttons
                    studentAdapterClass.setOnItemClickListener(new StudentAdapterClass.OnItemClickListener() {

                        @Override
                        public void onUpdateClick(int position) {
                            //handle update click in here
                            Student student = list.get(position);

                            //show update dialog here
                            showUpdateDialog(student.getStudentId(), student.getStudentName(), student.getStudentEmail());
                        }

                        @Override
                        public void onDeleteClick(int position){
                            //handle delete click in here
                            Student student = list.get(position);

                            //show delete dialog here
                            showDeleteDialog(student.getStudentId());
                        }

                    });

                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(StudentListActivity.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }//if

  
}


//dialog box for deleting student
private void showDeleteDialog(final String studentId){
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);

    LayoutInflater inflater = getLayoutInflater();

    //dialog XML
    final View dialogView = inflater.inflate(R.layout.delete_student_dialog, null);

    dialogBuilder.setView(dialogView);

    final ImageButton buttonNo = dialogView.findViewById(R.id.imageButtonNo);
    final ImageButton buttonYes = dialogView.findViewById(R.id.imageButtonYes);

    final AlertDialog alertDialog = dialogBuilder.create();
    alertDialog.show();

    buttonNo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            alertDialog.dismiss();
        }
    });

    buttonYes.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            deleteStudent(studentId);

            alertDialog.dismiss();
        }
    });
}

//delete student method
private void deleteStudent(String id){
    //get current user
    mAuth = FirebaseAuth.getInstance();
    FirebaseUser user = mAuth.getCurrentUser();
    //assert current user is not null and get current users id
    assert user != null;
    currentUserId = user.getUid();

    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("students").child(currentUserId).child(id);

    databaseReference.removeValue();

    Toast.makeText(this, "Student Deleted", Toast.LENGTH_LONG).show();

    //clear and get new list
    onStart();

}
公共类StudentListActivity扩展了AppCompatActivity{
//火基认证
私人消防队;
//公共变量
公共字符串currentUserAccount;
公共字符串teacherAccountNav=“Teacher”;
公共字符串currentUserId;
//循环视图变量
数据库参考文献;
数组列表;
回收视图回收视图;
搜索视图搜索视图;
@RequiresApi(api=Build.VERSION\u CODES.KITKAT)
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u student\u list);
//获取当前用户
mAuth=FirebaseAuth.getInstance();
FirebaseUser=mAuth.getCurrentUser();
//断言当前用户不为null并获取当前用户id
断言用户!=null;
currentUserId=user.getUid();
//获取当前用户和学生的firebase参考
ref=FirebaseDatabase.getInstance().getReference().child(“学生”).child(currentUserId);
//初始化视图
recyclerView=findViewById(R.id.rv);
recyclerView.setHasFixedSize(true);
searchView=findviewbyd(R.id.searchView);
}
@凌驾
受保护的void onStart(){
super.onStart();
如果(ref!=null){
ref.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
//将firebase中的学员添加到数组列表
if(dataSnapshot.exists()){
列表=新的ArrayList();
对于(DataSnapshot ds:DataSnapshot.getChildren()){
添加(ds.getValue(Student.class));
}
//按名称排序
Collections.sort(list,Student.myName);
//创建回收者视图
setLayoutManager(新的LinearLayoutManager(StudentListActivity.this));
StudentAdapterClass StudentAdapterClass=新的StudentAdapterClass(列表);
setAdapter(studentAdapterClass);
//单击按钮的侦听器
studentAdapterClass.setOnItemClickListener(新的studentAdapterClass.OnItemClickListener(){
@凌驾
更新点击时的公共无效(内部位置){
//处理更新点击这里
学生=列表。获取(位置);
//在此处显示更新对话框
showUpdateDialog(student.getStudentId(),student.getStudentName(),student.getStudentEmail());
}
@凌驾
公共位置单击(内部位置){
//处理删除点击这里
学生=列表。获取(位置);
//在此处显示删除对话框
showDeleteDialog(student.getStudentId());
}
});
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
Toast.makeText(StudentListActivity.this,databaseError.getMessage(),Toast.LENGTH_SHORT.show();
}
});
}//如果
}
//用于删除学生的对话框
私有void showDeleteDialog(最终字符串studentId){
AlertDialog.Builder dialogBuilder=新建AlertDialog.Builder(此);
LayoutInflater充气机=getLayoutInflater();
//对话框XML
最终视图对话框视图=充气机。充气(R.layout.delete\u student\u对话框,空);
dialogBuilder.setView(dialogView);
final ImageButton buttonNo=dialogView.findViewById(R.id.imageButtonNo);
final ImageButton buttonYes=dialogView.findViewById(R.id.imageButtonYes);
final AlertDialog AlertDialog=dialogBuilder.create();
alertDialog.show();
buttonNo.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
alertDialog.disclose();
}
});
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
删除学生(学生ID);
alertDialog.disclose();
}
});
}
//删除学生方法
私有无效删除学生(字符串id){
//获取当前用户
mAuth=FirebaseAuth.getInstance();
FirebaseUser=mAuth.getCurrentUser();
//断言当前用户不为null并获取当前用户id
断言用户!=null;
currentUserId=user.getUid();
DatabaseReference DatabaseReference=FirebaseDatabase.getInstance().getReference(“学生”).child(currentUserId).child(id);
databaseReference.removeValue();
Toast.makeText(此“学生已删除”,Toast.LENGTH_LONG).show();
//清除并获取新列表
onStart();
}
我的适配器:

public class StudentAdapterClass extends RecyclerView.Adapter<StudentAdapterClass.MyViewHolder> {

private ArrayList<Student> list;

private OnItemClickListener mListener;

public interface OnItemClickListener{
    //click method for update button
    void onUpdateClick(int position);
    //click method for delete button
    void onDeleteClick(int position);

}

public void setOnItemClickListener(OnItemClickListener listener){
    mListener = listener;
}

public StudentAdapterClass(ArrayList<Student> list){

    this.list = list;
}


@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
     View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_holder, viewGroup, false);
     return new MyViewHolder(view, mListener);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {
    myViewHolder.name.setText(list.get(i).getStudentName());
    myViewHolder.email.setText(list.get(i).getStudentEmail());

}

@Override
public int getItemCount() {

    return list.size();
}

static class MyViewHolder extends RecyclerView.ViewHolder {
    TextView name, email;
    ImageButton update, delete;
    MyViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
        super(itemView);
        name = itemView.findViewById(R.id.studentName);
        email = itemView.findViewById(R.id.studentEmail);
        update = itemView.findViewById(R.id.updateButton);
        delete = itemView.findViewById(R.id.deleteButton);

        //update click listener
        update.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null){
                    int position = getAdapterPosition();
                    if(position != RecyclerView.NO_POSITION){
                        listener.onUpdateClick(position);
                    }
                }

            }
        });

        delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null){
                    int position = getAdapterPosition();
                    if(position != RecyclerView.NO_POSITION){
                        listener.onDeleteClick(position);
                    }
                }
            }
        });
    }
}
公共类StudentAdapterClass扩展了RecyclerView.Adapter{
私有数组列表;
私人监听
recyclerView.getAdapter().notifyDataSetChanged()