RecyclerView项目中的ProgressBar未在notifyDataSetChanged

时间:2018-05-04 10:18:31

标签: java android android-recyclerview notifydatasetchanged

我看到了类似的问题here RecyclerView项目中的AnimationDrawable不在notifyDataSetChanged上设置动画。 但无法解决此问题或修复。我认为这是因为notifyDataSetChanged多次调用来更新UI。当我评论或通知更改呼叫的位置,它工作正常。 我在循环视图中有三个项目。

  1. 进度条
  2. 文字视图
  3. 按钮
  4. 我需要在按钮单击时调用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 :(得分:1)

doInBackground()方法在单独的线程中工作,甚至在UI线程上也没有。

在UI线程上通知您的适配器,来自AsyncTaskonPreExecute()&amp; onPostExecute()方法适用于UI线程。

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