android - 防止整个 RecyclerView 刷新,只添加新项目
问题描述
我嵌套了用于检索数据的侦听器:首先我从数据数据库中检索数据,然后,我得到一个拥有这些数据的用户列表,并将当前用户的列表保存在 ArrayList 中,这将是回收站视图。然后,我需要从用户数据库(他们的图像 id)中获取有关这些用户的一些信息,所以我在第一个 onDataChange 调用中再次调用用户数据库(因为它是异步的,我需要嵌套它们)。但是当我用新项目更新 ArrayList 时,或者每次数据库发生变化时,RecyclerView 都会“刷新”。这是代码:
**我认为原因是我每次调用新适配器时都会onDataChange
调用它。那么如何检查之前是否设置了适配器,如果设置了,那么就不要再设置了呢?
DatabaseReference rootReference = FirebaseDatabase.getInstance().getReference();
DatabaseReference dataReference = rootReference.child("data");
ValueEventListener dataListener= new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final ArrayList<String> foundUsers = new ArrayList<>();
for (DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
String userId= dSnapshot.getKey();
for(DataSnapshot ds : dSnapshot.getChildren()) {
if (userIsFound()){
foundUsers.add(userId);
}
}
}
mRecyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view);
mRecyclerView.setHasFixedSize(true);
// use a linear layout manager
mLayoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(mLayoutManager);
myDataset = new ArrayList<User>();
mAdapter = new MyAdapter(myDataset);
mRecyclerView.setAdapter(mAdapter);
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference imageIdRef= rootRef.child("users");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String currentUserId = ds.getKey();
if (foundUsers.contains(currentUserId )) {
if (ds.child("imageUrl").getValue() != null) {
String imageUrl = ds.child("imageUrl").getValue().toString();
myDataset.add(new User(currentUserId, imageUrl));
}
}
mAdapter.notifyDataSetChanged();
}
foundUsers.clear();
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
imageIdRef.addValueEventListener(eventListener);
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
dataReference.addValueEventListener(dataListener);
解决方案
您需要在您的班级覆盖该equals
方法,以便正常工作:User
contains
@Override
public boolean equals(@Nullable Object obj) {
if( obj instanceof User){
User = (User) obj;
return this.getCurrentUserId().equals(obj.getCurrentUserId());
}else{
return false;
}
}
并使用:
mAdapter.notifyItemInserted(myDataset.size() - 1);
推荐阅读
- python - 对.png图像使用pythons打开函数
- mysql - 如何评价一个表在数据库系统中的好坏?
- postgresql - PostgreSQL 服务器从 9.x 升级到 10 最简单的方法
- r - R - visreg 没有正确使用 glm
- html - 如何删除垂直堆叠的两个 div 之间的空间?
- aws-lambda - Lambda 无法连接到 VPC 中的 RDS
- git - 尝试在 windows 上使用 git 连接到远程机器时,使用正确的命令,没有响应
- selenium - 带有 Selenium 的 Chrome 驱动程序
- vb.net - vb.net - 检查Datagridview中是否有重复数据
- logging - 尝试在 TensorBoard 上记录 CNN TensorFlow 的准确性