2

我正在尝试更新我的列表并在我的活动中显示更新后的列表。每次我这样做我都会收到以下错误

 The content of the adapter has changed but ListView did not receive a notification.
 Make sure the content of your adapter is not modified from a background thread,
 but only from the UI thread.

这是我的代码,我正在使用 AsyncTask 来完成此任务。我在我的适配器上调用 notifyDataSetChanged() 但它似乎不起作用。我究竟做错了什么?

  class MyTask extends AsyncTask<Context, Integer, String> {

    @Override
    protected String doInBackground(Context... params) {
        GregorianCalendar currentDateclone = (GregorianCalendar) currentDate.clone();
        ListPopulater2.listPopulate(currentDateclone, 7, items, Id);
                    //method to update list info




    }

    // -- gets called just before thread begins
    @Override
    protected void onPreExecute() {
        progressdialog = ProgressDialog.show(SectionListExampleActivity.this, "", "Loading..."); //display progress bar
        super.onPreExecute();

    }

    // -- called as soon as doInBackground method completes
    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        Log.d("postExecute", "here");
                    adapter.notifyDataSetChanged();

        progressdialog.cancel();
    }
}
4

2 回答 2

3

尝试移动:

ListPopulater2.listPopulate(currentDateclone, 7, items, Id);

到你的onPostExecute.

这样做的原因是您需要在完成所有后台活动后更新列表,而不是在您执行此操作时。您可以使用onProgressUpdate, 但这是为您的进度对话框。更新您的列表视图应该在您拥有所有数据后完成,否则,您将收到您所做的错误,因为 UI 在主线程上运行,并且您正在尝试使用后台线程对其进行更新。

至于进度对话框,是有目的的。如果您正在做一些需要一段时间才能完成的事情,对话框将告诉用户您离完成后台任务还有多远。

希望这是有道理的。

于 2012-07-11T00:11:00.617 回答
2

当您想要做一些处理 UI 的事情时,您必须在 UI 线程中执行该任务。因此,为此您可以使用 2 种方法:

  1. 使用 runOnUi() 方法
  2. 使用 OnPostExecute() 方法

而且您必须在您在 listView 中设置适配器的地方使用 notifyDatasetchanged()。

于 2015-06-03T11:54:12.797 回答