Ошибка notifyDataSetChanged () в RecyclerView при его прокрутке до последней позиции - PullRequest
0 голосов
/ 20 июня 2019

Я использую RecyclerView для отображения списка строк, каждая строка имеет кнопку покупки.когда пользователь покупает элемент, вызывается метод notifydatasetchanged (), и кнопка покупки должна изменить цвет фона, например, на красный.

Важно, пользователь должен купить только один элемент, и у меня есть поток, который запускается каждые 5 секунд в поисках новых ответов, если есть новый ответ, он добавляется в список и прокручивается до последней позиции.

Моя проблема в том, что у меня есть список кнопок, и только одна из них красная, а у меня новый ответ, я добавляю его в список, но кнопка некоторых строк становится красной.

это мой код:

private void responses() {
 fin_thread = true;
 thread = new Thread() {
  @Override
  public void run() {
   while (fin_thread) {
    try {
     Thread.sleep(5000);
     runOnUiThread(new Runnable() {
      @Override
      public void run() {
       JsonObjectRequest service_call = new JsonObjectRequest(Request.Method.GET, url, null,
        new Response.Listener < JSONObject > () {
         @Override
         public void onResponse(JSONObject response) {
          try {
           boolean status = response.getBoolean("value_status_response");
           if (status) {
            if (response.getInt("counter") > 0 && obj_response.size() > 0) {
             JSONArray answer = response.getJSONArray("answer");
             if (answer.length() != obj_response.size()) {
              for (int i = 0; i < answer.length(); i++) {
               boolean coincidence = false;;
               JSONObject item = answer.getJSONObject(i);
               for (int j = 0; j < obj_response.size(); j++) {
                if (item.getId("id") == obj_response.get(j).getId()) {
                 coincidence = true;
                 break;
                }
               }
               if (!coincidence) {
                CResponse cr = new CResponse();
                cr.setName(item.getString("name"));
                cr.setPrice(item.getString("price"));
                cr.setId(item.getInt("id"));
                cr.setState(item.getInt("state"));
                obj_response.add(cr);
                sectionAdapter.notifyDataSetChanged();
                scroll_to_last();
               }
              }
             }
            } else {
             if (response.getInt("counter") > 0 && obj_response.size() == 0) {
              JSONArray answer = response.getJSONArray("answer");
              for (int i = 0; i < answer.length(); i++) {
               JSONObject item = answer.getJSONObject(i);
               CResponse cr = new CResponse();
               cr.setName(item.getString("name"));
               cr.setPrice(item.getString("price"));
               cr.setId(item.getInt("id"));
               cr.setState(item.getInt("state"));
               obj_response.add(cr);
               sectionAdapter.notifyDataSetChanged();
               rv.setVisibility(View.VISIBLE);
               progress_bar.setVisibility(View.GONE);
              }
             }
            }
           }
          } catch (JSONException e) {
           e.printStackTrace();
          }
         }
        },
        new Response.ErrorListener() {
         @Override
         public void onErrorResponse(VolleyError error) {
          NetworkResponse networkResponse = error.networkResponse;
          if (networkResponse != null) {
           //ERROR
          }
         }
        }
       ) {
        @Override
        public Map < String, String > getHeaders() throws AuthFailureError {
         Map < String, String > params = new HashMap < String, String > ();
         params.put("Authorization", "Basic " + auth);
         return params;
        }
       };
       Helpers.queue(Class.this).add(service_call);
      }
     });
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }
 };
 thread.start();
}

private void scroll_to_last() {
 lm.scrollToPosition(sectionAdapter.getItemCount() - 1);
}
My Adapter

@Override
public void onBindItemViewHolder(RecyclerView.ViewHolder holder, final int position) {
 final MyViewPedidoDesc itemHolder = (MyViewPedidoDesc) holder;
 control_btn_background(itemHolder, position);
}

private void control_btn_background(MyViewPedidoDesc itemHolder, int position) {
 if (mData.get(position).getState() == 1) {
  itemHolder.buy_btn.setBackgroundResource(R.drawable.red);
 } else {
  itemHolder.buy_btn.setBackgroundResource(R.drawable.blue);
 }
}

Я думаю, что ошибка возникает, когда я вызываю scroll_to_last() метод, потому что, если я не вызываю, цвет фона находится только в одной кнопке.

Спасибо за продвижение

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