如何在AsyncTask中调用notifyDataSetChanged()

3

我有一个 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);

你可以在主类中创建一个void,用于调用notifyDataSetChanged,并使onPostExecute调用该void。 - Rotary Heart
1个回答

4
您可以这样调用它:
ColorAdapter.this.notifyDataSetChanged();

顺便提一下,更适合启动这个AsyncTask的地方应该是它所在的片段/活动,为什么呢? 如果不正确地管理它们的生命周期,AsyncTasks有时会比您预期的更长时间存在,它们可能会引起麻烦。


唔,我在适配器类中使用AsyncTask的唯一原因是因为列表中每一行都有一个按钮可以删除该项。所以我被迫将其放在我的自定义ArrayAdapter中。 - Anthony
你没有发布完整的代码,但从它的外观来看,如果你只是从一个列表中删除一个项目,我不认为你需要一个AsyncTask。如果你能详细说明你想做什么,可能会有更好的解决方案来解决你的问题。 - woot
我正在从列表中删除一个项目,但是删除也必须在服务器端进行。因此,每次我从列表中删除一个项目,我还必须向我的服务器代码发出DELETE REST调用,而我认为这只能通过AsyncTask完成。 - Omnipresent
这真的超出了适配器的范围。您可以从活动/片段中发出REST请求,在那里您将能够在获得网络响应之前立即从适配器中删除数据,或者例如显示进度对话框并在一旦从网络获得响应后更改适配器中的数据。无论您选择哪条路径,从活动或片段启动任务都将使您能够在某些情况下取消它(即用户按下返回按钮),这也将减少不必要的电池使用。 - woot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接