Как правильно обновить набор данных после получения списка JSON с сервера? - PullRequest
0 голосов
/ 12 января 2019

Я получаю массив пользовательских идентификаторов 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); }
   }

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Вы можете использовать функции Firebase Cloud. Пропустите функцию JSON Array to cloud и получите обновленный набор данных за один раз и уведомите о перезапуске. Вот здесь ссылка

0 голосов
/ 12 января 2019

Вас может заинтересовать DiffUtil .

Он использует эффективный алгоритм для расчета разницы между вашими списками. И вишня наверху в том, что это можно запустить в фоновом потоке.

Это альтернатива notifyDataSetChanged() и является своего рода стандартным способом обновления вашего RecyclerView

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...