ProgressBar в RecyclerView элемент не анимируется на notifyDataSetChanged - PullRequest
0 голосов
/ 04 мая 2018

вижу похожий вопрос здесь AnimationDrawable в элементе RecyclerView не анимируется в notifyDataSetChanged. Но не удалось решить эту проблему или исправить. Я думаю, потому что notifyDataSetChanged несколько раз вызывают вызов для обновления пользовательского интерфейса. Пока я комментирую или уведомляю о смене звонка на должность он работает нормально. У меня есть три пункта в переработанном виде.

  1. Индикатор выполнения
  2. Просмотр текста
  3. Кнопка

Мне нужно вызвать API по нажатию кнопки и увеличить значение textview. в то время как вызовы API мне нужно показать индикатор выполнения и скрыть, пока API заканчивает

Нажатие кнопки, как следует,

holder.image_add_overlay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            holder.progressBar2.setVisibility(View.VISIBLE);             
            UpdateProductItem(holder, position);
        }
    });

private void UpdateProductItem(ShoppinglistAdapter.ViewHolder holder, int position) {
    try {
        Boolean value = CartFunctions.UpdateCartPostValue(cartAdd, mAPIService);
        if (value) {
            holder.text_item_cart_count.setText("" + holder.cart_count_value);
                // notifyDataSetChanged();
                holder.progressBar2.setVisibility(View.GONE);
                Task task = new Task();
                task.execute(); 
            Toast.makeText(context, context.getResources().getString(R.string.cart_update_toast_message), Toast.LENGTH_SHORT).show();
        } else {
            holder.cart_count_value = holder.cart_count_value - 1;
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
}

Я тоже попробую

@SuppressLint("StaticFieldLeak")
public class Task extends AsyncTask<String, Integer, Integer> {

    @Override
    protected Integer doInBackground(String... strings) {
        Log.i("test", "doInBackground");
        // notifyDataSetChanged();
        return null;
    }

    @Override
    protected void onPostExecute(Integer integer) {
        Log.i("test", "onPostExecute");
        notifyDataSetChanged();
        super.onPostExecute(integer);
    }
}

И вызовите это используя

Task task = new Task();
//task.doInBackground();
task.onPostExecute(0);

Пусть 2 элемента в окне повторного использования одинаковы, поэтому показывается, что оба значения становятся одинаковыми. поэтому мне нужно notifyDataSetChanged () вместо notifyItemChanged (position); Кто-нибудь, ребята, знали решение?

1 Ответ

0 голосов
/ 04 мая 2018

doInBackground() метод работает в отдельном потоке, даже в потоке пользовательского интерфейса.

Уведомить адаптер в потоке пользовательского интерфейса. С AsyncTask: onPreExecute() & onPostExecute() метод работает в потоке пользовательского интерфейса.

public class Task extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        adapter.notifyDataSetChanged();
    }
}

Вызовите свою задачу, используя,

Task task = new Task();
task.execute();

Подробнее см. AsynkTask .

...