0

我有一个由 SimpleAdapter 填充的 ListView,它从 HashMaps 的 ArrayList 中获取值。arraylist 是由一种load()从我的站点获取数据的方法构建的。我有一个菜单选项,允许通过再次获取数据并调用来刷新数据,adapter.notifyDataSetChanged()它实际上工作正常,更新数组列表并刷新 ListView。现在,建立 http 连接并获取数据需要几秒钟,load()所以我想设置一个 ProgressDialog 来通知用户正在进行的过程。我知道我不能将 ProgressDialog 放在 ui 线程上load()有效,所以我尝试使用 AsyncTask。它工作正常,在获取新数据并将其传递给适配器时显示对话框,但它也增加了一个问题:ListView 不再刷新显示的项目,除非我将修改后的列表项目滚动到屏幕之外并且返回,然后它会显示新的内容。我该怎么做才能同时拥有 ProgressDialog 和列表内容的刷新?
这是 AsyncTask 中带有 ProgressDialog 的代码(编辑数据但不触发屏幕上的列表刷新):

public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
    case R.id.update: {         
        loading.show();  //the ProgressDialog
        AsyncTask<Void, Void, Void> loadingTask = new AsyncTask<Void, Void, Void>() {

            @Override
            protected Void doInBackground(Void... params) {                 
                load(); //fetching data, takes a while
                return null;
            }
            @Override
            protected void onPostExecute(Void result) {                                     
                loading.dismiss();
            }

        };          
        loadingTask.execute();
        adapter.notifyDataSetChanged();         
        return true;
    }
    default:
        return super.onOptionsItemSelected(item);
    }
}

这是刷新 ListView 以及后面的数据的代码(但不会让我设置 ProgressDialog):

public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
    case R.id.update: {                                                         
        load();
        adapter.notifyDataSetChanged();                     
        return true;
    }
    default:
        return super.onOptionsItemSelected(item);
    }
}
4

1 回答 1

0

只需添加AsycTask并从中添加onPreExecute()。并 放入AsyncTask。_show() ProgressDialogadapter.notifyDataSetChanged();onPostExecute()

像,

    AsyncTask<Void, Void, Void> loadingTask = new AsyncTask<Void, Void, Void>() {
        @Override
        protected void onPreExecute() {                                     
            loading.show();  //the ProgressDialog
        }

        @Override
        protected Void doInBackground(Void... params) {                 
            load(); //fetching data, takes a while
            return null;
        }
        @Override
        protected void onPostExecute(Void result) {  
          adapter.notifyDataSetChanged();                                        
            loading.dismiss();
        }

    };          
    loadingTask.execute();      
    return true;
于 2012-07-12T09:44:57.353 回答