我看到了类似的问题here RecyclerView项目中的AnimationDrawable不在notifyDataSetChanged上设置动画。 但无法解决此问题或修复。我认为这是因为notifyDataSetChanged多次调用来更新UI。当我评论或通知更改呼叫的位置,它工作正常。 我在循环视图中有三个项目。
我需要在按钮单击时调用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); 有没有人知道解决方案?
答案 0 :(得分:1)
doInBackground()
方法在单独的线程中工作,甚至在UI线程上也没有。
在UI线程上通知您的适配器,来自AsyncTask
:onPreExecute()
&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。