0

HashMaps の ArrayList から値を取得する SimpleAdapter によって設定された ListView があります。arraylist はload()、私のサイトからデータをフェッチするメソッドによって構築されます。データを再度取得して呼び出すことでデータを更新できるメニューオプションがadapter.notifyDataSetChanged()あり、実際には正常に動作し、arraylist を更新し、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 に答える