У меня есть вложенные прослушиватели для извлечения данных: сначала я извлекаю данные из базы данных, а затем получаю список пользователей, у которых есть эти данные, и сохраняю список существующих пользователей в ArrayList, который будетнабор данных для RecyclerView.Затем мне нужно получить некоторую информацию об этих пользователях из базы данных пользователей (их идентификаторы изображений), поэтому я делаю еще один вызов в базу данных пользователей из первого вызова 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);