【问题标题】:How to call notifyDataSetChanged() from within AsyncTask如何从 AsyncTask 中调用 notifyDataSetChanged()
【发布时间】:2014-02-21 22:38:43
【问题描述】:

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

【问题讨论】:

  • 您可以在主类中调用 notifyDataSetChanged 并让 onPostExecute 调用该 void。

标签: java android android-asynctask android-adapter


【解决方案1】:

你可以这样称呼它:

ColorAdapter.this.notifyDataSetChanged();

顺便说一句,启动这个AsyncTask 的更合适的地方是它的主机片段/活动,为什么? AsyncTask 的存在时间往往比您预期的要长,如果您没有适当地管理它们的生命周期,它们可能会导致麻烦。

【讨论】:

  • 嗯,我在适配器类中唯一真正拥有此 AsyncTask 是因为列表的每一行上的按钮都可以删除该项目。所以我不得不把它放在我的自定义 ArrayAdapter 中。
  • 您还没有发布完整的代码,但是如果您只是从列表中删除一个项目,我认为您不需要 AsyncTask。如果您可以详细说明您正在尝试做什么,那么可能会有更好的解决方案来解决您的问题。
  • 我正在从列表中删除一个项目,但删除也必须在服务器端进行。因此,每次我从列表中删除一个项目时,我都必须对我的服务器代码进行 DELETE REST 调用,并且我认为只能从 AsyncTask 进行调用
  • 这真的超出了适配器的范围。你可以从你的活动/片段发出 REST 请求,在那里你可以立即从适配器中删除数据(在你得到响应之前) 或例如显示进度对话框并在收到网络响应后更改适配器中的数据。无论您选择哪种路径,从 Activity 或 Fragment 启动任务都允许您在某些情况下取消它(即用户点击返回按钮),这也将减少不必要的电池使用量。
猜你喜欢
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多