Я использую 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()
метод, потому что, если я не вызываю, цвет фона находится только в одной кнопке.
Спасибо за продвижение