Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从AsyncTask中调用notifyDataSetChanged()_Java_Android_Android Asynctask_Android Adapter - Fatal编程技术网

Java 如何从AsyncTask中调用notifyDataSetChanged()

Java 如何从AsyncTask中调用notifyDataSetChanged(),java,android,android-asynctask,android-adapter,Java,Android,Android Asynctask,Android Adapter,我有一个ArrayAdapter,其中有一个AsyncTask,但我不知道如何从onPostExecute调用notifyDataSetChanged 例如: public class ColorAdapter extends ArrayAdapter<Color> { List<Color> colorList; Context context; .... public ColorAdapter(Context context, List<Co

我有一个
ArrayAdapter
,其中有一个
AsyncTask
,但我不知道如何从
onPostExecute
调用
notifyDataSetChanged

例如:

public class ColorAdapter extends ArrayAdapter<Color> {

  List<Color> colorList;
  Context context;
  ....

  public ColorAdapter(Context context, List<Color> list) {
    this.context = context; this.colorList = list;  
  }

  public View getView (final int position, final View view, final ViewGroup parent) { 
   .....
  }

  class DeleteColorTask extends AsyncTask <String, String, String> {
   int colorId;
   DeleteColorTask (int colorId) {this.colorId = colorId;} 

   protected String doInBackgroud (String ... args) {
     //call to server to delete the color
     colorList.remove(colorList.indexOf(...));
   }
   protected void onPostExecute(String s) {
     //HOW CAN I CALL notifyDataSetChanged() here?? this.notifyDataSetChanged() doesn't work since I am inside DeleteColorTask class
   }
  }
}

你可以这样称呼它:

  adapter = new ColorAdapter(context, colorsList);
  setListAdapter(adapter);
ColorAdapter.this.notifyDataSetChanged();
另一方面,启动此
AsyncTask
的更合适的位置是它的主机片段/活动,为什么?
异步任务有时比您预期的时间长,如果您不适当地管理它们的生命周期,它们可能会造成麻烦。

您可以在主类中创建一个void来调用
notifyDataSetChanged
,并使
onPostExecute
调用该void.hmm适配器类中唯一真正的异步任务是因为列表每行上的一个按钮都可以删除该项。所以我不得不把它放在我的自定义ArrayAdapter中。你还没有发布完整的代码,但是从它的外观来看,如果你只是从列表中删除一个项目,我认为你不需要异步任务。如果你能详细说明你想做什么,可能会有更好的解决方案。我正在从列表中删除一项,但删除也必须在服务器端进行。因此,每次我从列表中删除一个项目时,我也必须对服务器代码进行DELETE-REST调用,我认为这只能从实际超出适配器范围的AsyncTask中进行。。您可以从活动/片段发出REST请求,在那里您可以立即从适配器中删除数据(在获得响应之前),或者例如,在从网络获得响应后显示进度对话框并更改适配器中的数据。无论您选择何种路径,从活动或片段启动任务将允许您在某些情况下取消它(即用户点击“后退”按钮),这也将减少不必要的电池使用。