当 AsyncTask 在适配器内时刷新 ListView

Posted

技术标签:

【中文标题】当 AsyncTask 在适配器内时刷新 ListView【英文标题】:Refresh ListView when an AsyncTask is inside the Adapter 【发布时间】:2016-01-09 22:14:46 【问题描述】:

我有一个 ListView 和一个自定义适配器。自定义适配器实现了一个 AsyncTask 来从服务器加载一些图像。创建活动时一切正常。但是,ListView 有一个加载按钮来加载更多行,每行包含一个图像。按下加载按钮时,新数据(图像)会正确添加到 ListView。但是,尽管调用了 notifyDataSetChanged,但 ListView 并未刷新。我必须移动 scoll 以刷新 ListView 并显示新数据。问题是新图像是在 Adapter 内的 AsyncTask 中加载的,当在 MainActivity 中调用 notifyDataSetChanged 时,AsyncTask 尚未完成。所以,我的问题是:有没有办法在 AsyncTask 完成后刷新 ListView?在 Adapter 内部调用 notifyDataSetChanged 还是其他替代方法?

【问题讨论】:

为您的activity 实现一个interface 并从您的onPostExecute() 方法更新它。 【参考方案1】:

在您的 asynctask onPostExecute 中应该是这样的:

@Override
  protected void onPostExecute(String result) 
   ((MainActivity) getActivity).notifyDataChanged();
  

根据您的代码的组织方式,您将调用notifyDataChanged(),方式与此类似。

【讨论】:

问题是notifyDataSetChanged是Adapter要使用的方法。 没关系,调用MyListAdapter.this.notifyDataSetChanged();,其中MyListAdapter 是您的自定义适配器的类的名称。【参考方案2】:

所以,我的问题是:有没有办法在 AsyncTask 完成后刷新 ListView?

是的,你可以这样做:

    ListView 传递给 AsyncTask, 覆盖onPostExecute() 方法, 在onPostExecute()方法中调用notifyDataChanged

【讨论】:

问题是 notifyDataSetChanged 是从适配器使用的方法,我不能将适配器传递给它自己。

以上是关于当 AsyncTask 在适配器内时刷新 ListView的主要内容,如果未能解决你的问题,请参考以下文章

AsyncTask 不断重复 onResume

AsyncTask 在自定义适配器中不起作用

如何刷新 ListView 中的数据?(json&http)

如何动态刷新 ListView? [复制]

android怎么刷新适配器

为啥我不能在 AsyncTask 中为另一个类的 ListView 设置适配器?