Я получаю массив пользовательских идентификаторов JSON с сервера (не сервера Firebase).
Я также храню изображения каждого пользователя в хранилище Firebase. У меня есть набор данных пользователей, который содержит идентификатор пользователя и URL-адрес изображения пользователя. Ответ JSON постоянно обновляется, поэтому при каждом вызове я получаю новый ответ от сервера с новым списком идентификаторов пользователей. Единственное решение, которое я придумал, это:
Очистить набор данных> Выполнить цикл по массиву JSON, чтобы добавить всех пользователей в пустой набор данных> набор уведомлений изменен.
Проблема в том, что это неэффективно: я уведомляю набор данных, изменяемый на каждой итерации, а также, поскольку я очищаю набор данных при каждом новом ответе (с удаленного сервера), список обновляется вместо простого добавления / удаления необходимые пользователи.
Вот как выглядит код:
@Override
public void onResponse(JSONArray response) { // the JSON ARRAY response of user ids ["uid1", "uid334", "uid1123"]
myDataset.clear(); // clear dataset to prevent duplicates
for (int i = 0; i < response.length(); i++) {
try {
String userKey = response.get(i).toString(); // the currently iterated user id
final DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userKeyRef = rootRef.child("users").child(userKey); // reference to currently iterated user
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
myDataset.add(new User(dataSnapshot.getKey(), dataSnapshot.child("imageUrl").getValue().toString())); //add new user: id and image url
mAdapter.notifyDataSetChanged(); // notify data set changed after adding each user (Not very efficient, huh?)
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage());
}
};
userKeyRef.addListenerForSingleValueEvent(listener);
}
catch (JSONException e) { Log.d(TAG, "message " + e); }
}