【问题标题】:Updating arrayAdapter with new data in AsyncTask在 AsyncTask 中使用新数据更新 arrayAdapter
【发布时间】:2014-12-19 12:25:27
【问题描述】:

我的活动中有以下 AsyncTask,它更新了填充我的 ListView 的 ArrayAdapter。它似乎工作正常,因为我在 onPostExecute 中调用 notifyDataSetChanged。

我的问题是,如果我在 runOnUIThread 中使用 onPostExecute 调用 notifyDataSetChanged,为什么它只更新列表视图?

我认为 onPostExecute 在 UIThread 上运行,所以我需要将它包装在 Runnable 中吗?

@Override
protected void onPostExecute(LoginWebservice.TwoDimentionalArrayList<String> result) {
    super.onPostExecute(result);

    if (progressDialog != null) {
        progressDialog.dismiss();
    }

    listView = (ListView) findViewById(R.id.rotalist);

    arrayAdapter = new MySimpleArrayAdapter(GetRota.this, array);
    listView.setAdapter(arrayAdapter);
    listView.setOnItemClickListener(GetRota.this);

    runOnUiThread(new Runnable() {
        public void run() {
            arrayAdapter.notifyDataSetChanged();
        }
    });

}

【问题讨论】:

    标签: android listview android-asynctask android-adapter


    【解决方案1】:

    您甚至不需要调用notifyDataSetChanged()。您正在创建一个新适配器并将其设置为ListView。之后您无需进行任何修改,因此无需调用该方法。这是多余的。

    【讨论】:

    • 是的,你是对的,我已经删除了它,它仍然有效。每次数据更改时创建新适配器是否有任何问题。问题是,如果服务器没有返回数据,那么我会显示不同的布局,所以我将列表视图和适配器设置为 null。如果调用了对服务器的新调用并且这次它返回数据,那么我切换回布局并重新实例化列表视图和适配器等
    • 取决于这种情况发生的频率。当设置一个新的适配器时,所有缓存的视图和测量值都会被转储。 ListView 将从头开始创建所有新视图,并且可能必须进行一些重新测量(这会导致发生一些虚拟视图生成)。性能方面,最好先清除 addAll...但是如果这只是单击一个按钮并且您重新加载数据有点...您可能没问题。
    • 附带说明,ListView 支持在空视图时显示空视图...您可以自定义。 developer.android.com/reference/android/widget/…
    猜你喜欢
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多