Java 列表<;用户>;不删除RecyclerView适配器中包含的POJO对象

Java 列表<;用户>;不删除RecyclerView适配器中包含的POJO对象,java,android,arraylist,firebase-realtime-database,android-recyclerview,Java,Android,Arraylist,Firebase Realtime Database,Android Recyclerview,我正在从Firebase数据库读取用户数据(姓名、年龄),并将其显示在回收器视图中。当用户长时间单击某个项目时,该项目将成功从firebase中删除,但当我尝试在子侦听器的onChildRemoved方法中从用户列表(例如List)中删除该项目时,该用户不会被删除。代码是: mChildListener=new ChildEventListener() { @Override public void onChildAdded(@NonNull Da

我正在从Firebase数据库读取用户数据(姓名、年龄),并将其显示在回收器视图中。当用户长时间单击某个项目时,该项目将成功从firebase中删除,但当我尝试在子侦听器的onChildRemoved方法中从用户列表(例如List)中删除该项目时,该用户不会被删除。代码是:

mChildListener=new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                User user=dataSnapshot.getValue(User.class);
                user.setUid(dataSnapshot.getKey());

                mDataList.add(user);
                mUserAdapter.notifyDataSetChanged();
                //passing the user returned to adapter but didn't work
                mUserAdapter.updateDataSet(user);
            }
            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {  
                User user=dataSnapshot.getValue(User.class);
                user.setUid(dataSnapshot.getKey());

                mDataList.remove(user);
                mUserAdapter.notifyDataSetChanged();
            }
        };
这是用户模型类:

public class User {
    private String uid;
    private String name;
    private int age;
    public User() {}
    public User(String uid, String name, int age) {
        this.uid = uid;
        this.name = name;
        this.age = age;
    }
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getUid() {return uid;}
    public void setUid(String uid) {this.uid = uid;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}
}
回收器视图代码如下所示:

@Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

        User user=mDataList.get(position);

        holder.textView.setText(user.getName()+ "  |  "+user.getAge());

        holder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String uid=user.getUid();
                Intent intent=new Intent(mContext,DetailsActivity.class);
                intent.putExtra(USER_KEY,uid);
                mContext.startActivity(intent);
            }
        });
        holder.textView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                //this line returns true
                boolean remove = mDataList.contains(user);
                //if I try to remove the user here, its removed
                //this line works as I want
//                mDataList.remove(user);
                Log.d(MainActivity.TAG, "updateDataSet: Contains: "+remove);
                Task<Void> removeUser = NetworkUtils.removeUser(user.getUid());
                removeUser.addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Toast.makeText(mContext, "User removed", Toast.LENGTH_SHORT).show();
                        //mDataList.remove(user);
                        //notifyDataSetChanged();
                    }
                });
                return true;
            }
        });
    }
我的问题是:

1) 如何从回收者视图列表中删除长时间单击时删除的项目

2) 我在
MainActivity.java
中有
List mDataList
,在
UserAdapter.java
中有一个。 我正在将
main活动中的
mDataList
传递给
UserAdapter
。 这两个在记忆中是相同的还是不同的?如果不同,则如何更改
main活动中的
列表mDataList
(在
onchildaded
中添加新项)更改
用户适配器中的
列表mDataList
? 谢谢。
我已尽最大努力澄清我的问题。

使用equals()方法更新您的用户类:

现在更新onChildRemoved方法:

@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) { 
      User user=dataSnapshot.getValue(User.class);
      user.setUid(dataSnapshot.getKey());
      int index = mDataList.indexOf(user);
      mDataList.remove(index);
      mUserAdapter.notifyDataSetChanged();
    }

注意:如果mDataList中不存在uid,它将返回-1。

您在哪里调用onChildRemoved?我正在将子侦听器附加到onCreate of main activity中的数据库引用。非常感谢。问题解决了。我想到了这一点,但没有尝试。你能解释一下为什么我需要重写equals方法吗?你对我的第二个问题怎么看?再次感谢。请投票表决这个问题,因为这将有助于我在未来的问题。过度使用equals方法可以直接为您提供索引,而无需使用for循环或迭代器。我已经投票了,谢谢。重写equals方法后,remove方法即使没有索引也能工作。关于我的帖子中的第二个问题,您觉得怎么样?这取决于您在适配器中如何声明arraylist。如果您使用new关键字创建arraylist,显然需要不同的内存,如果您只是声明arraylist,即List mArrayList,在这种情况下,它不会占用不同的内存。请接受答案,如果对你有帮助的话,请投赞成票。明白了。谢谢。答案被接受并被投票表决。
public class User {
    private String uid;
    private String name;
    private int age;
    public User() {}
    public User(String uid, String name, int age) {
        this.uid = uid;
        this.name = name;
        this.age = age;
    }
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getUid() {return uid;}
    public void setUid(String uid) {this.uid = uid;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof User) {
            User user= (User) obj;
            return uid.equals(user.getUid());
        } else return false;
    }
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) { 
      User user=dataSnapshot.getValue(User.class);
      user.setUid(dataSnapshot.getKey());
      int index = mDataList.indexOf(user);
      mDataList.remove(index);
      mUserAdapter.notifyDataSetChanged();
    }