Java 列表<;用户>;不删除RecyclerView适配器中包含的POJO对象
我正在从Firebase数据库读取用户数据(姓名、年龄),并将其显示在回收器视图中。当用户长时间单击某个项目时,该项目将成功从firebase中删除,但当我尝试在子侦听器的onChildRemoved方法中从用户列表(例如List)中删除该项目时,该用户不会被删除。代码是: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
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();
}