Обновить значение Recyclerview с ответом Webservice - PullRequest
0 голосов
/ 28 февраля 2019

У меня здесь сложная проблема.

Я инициализирую свой RecyclerView с некоторыми данными, но асинхронно получаю данные из своего веб-сервиса и хочу использовать эти данные, чтобы они были в моем RecyclerView, но это"слишком поздно", потому что мой RecyclerView уже инициализирован.

Вот некоторый код:

Прежде всего, я инициализирую свой RecyclerView с некоторыми данными

JSONArray medias; <- Global variable
ServiceProvider serviceProvider = new ServiceProvider(); <- Global variable where I'm doing my request

public void performRequest()
{
    for (int j = 0; j < 3; j += 1) {
         JSONObject newElem = new JSONObject();
         newElem.put("path", "test");
         newElem.put("state", "ongoing");
         newElem.put("name", "element " + j);
         medias.put(newElem);
         serviceProvider.addMedia(getActivity(), new CallbackInterface() {
          @Override
          public void callbackaddMedia(Boolean success, JSONObject obj) {
             if (success && obj != null)
             {
                //Here I want to use the response object like
                //Update medias item state by obj.optString("state");
             }
          }
       });
   }
   initRecyclerView();
}

private void initRecyclerView(){
    adapter = new DocumentsAdapter(getActivity(),false, medias, this);
    LinearLayoutManager mLayoutManager = new LinearLayoutManager(getContext());

    binding.recyclerAll.setLayoutManager(mLayoutManager);
    binding.recyclerAll.setItemAnimator(new DefaultItemAnimator());
    binding.recyclerAll.setAdapter(adapter);
}

Икак я уже сказал, асинхронно я вызываю Web-сервис, который отправляет мне ответ, подобный этому, каждый раз с другим mediaId и состоянием:

{
    "success": true,
    "mediaId": "307",
    "state": "success"
}

1 Ответ

0 голосов
/ 08 марта 2019

Как уже было сказано в комментарии, я использовал метод notifyDataSetChanged () следующим образом:

for (int k = 0; k < medias.length(); k += 1) {
    JSONObject mediaObject = (JSONObject) medias.opt(k);
    if (mediaObject.optString("gUid").equals(obj.optString("guid"))) {
        mediaObject.put("state", obj.optString("state"));
        mediaObject.put("id", obj.optString("mediaId"));
        mediaObject.put("path", obj.optString("path"));
        if (getActivity() != null) {
         getActivity().runOnUiThread(new Runnable() {
         @Override
         public void run() {
         if (adapter != null) {
         // I'm on my Fragment so I call my adapter like this , If you want to do this on your adapter , just call notifyDataSetChanged();
         adapter.notifyDataSetChanged();
         }
       }
      });
     }
    break;
   }
  }

Я только что обновил один за другим элементы моих «медиасредств» JSONArray, отправленных в моем адаптере RecyclerView.И затем после этого я просто вызвал notifyDataSetChanged () в MAINTHREAD.Он автоматически обновит все значения в моем JSONArray и, таким образом, изменит значения в моем макете

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