13

这是我的情况:

onCreate()AsyncTaskArrayList.

然后在我的onCreateView(),我想把这些数据放在 a 中ListView,设置一个onItemClickListener等......

问题是我正在创建AsyncTask和 UI 线程之间的竞赛。如果在完成检索onCreateView()之前调用了AsyncTask,那么我没有正确设置适配器,也没有设置onItemClickListener,等等......

我想要一些方法来确保在启动函数AsyncTask之前等待完成执行。onCreateView()这可能吗?我阅读了有关get()在任务上使用的信息,但在执行它时遇到了一些麻烦。它似乎没有做任何事情。

我想检索数据onCreate()并在其中设置适配器onCreateView()(而不是在 中设置适配器)onPostExecute()AsyncTask原因是,我想检索一次数据,并且能够在用户旋转屏幕或导航回到那个Fragment

4

3 回答 3

10

这是一个更好的方法。初始化您的ListView并开始您AsyncTaskonCreate(). 一旦数据从服务器可用,您将其添加到提供给您的适配器和调用notifyDatasetChanged()您的适配器的同一数组中,该数组负责填充您的列表视图。如果您的列表为空,您也可以在此处ListFragment调用setEmptyText()添加显示的文本。

于 2013-02-21T01:22:18.667 回答
1

您应该遵循@sujith 的回答并更改您的实施,但这里是您具体问题的答案:

我想要一些方法来确保在启动 onCreateView() 函数之前等待 AsyncTask 完成执行。这可能吗?

是的,这是可能的,但它会阻止您的 UI 在等待任务完成时显示。

创建并执行AsyncTask对它的引用:

MyAsyncTask mTask;

...
...onCreate()
mTask = new MyAsyncTask();
mTask.execute();
...
...onCreateView()
myInfo = mTask.get();
super.onCreateView().

在您的情况下,这是一个坏主意,但是,有时您可能需要做这样的事情。

编辑:mTask.get()将返回由doInBackground()

于 2013-02-21T01:44:51.667 回答
0

无论你在做什么onCreateView(),把它移到onViewCreated()

onViewCreated在视图准备好后调用,所以你不会有问题

于 2013-02-21T00:58:25.840 回答