2012-01-22 13 views
1

こんにちは私は非同期操作の後にリストビューをリフレッシュする問題があります。
私はシンプルカーソルアダプターと、リストビューとボタンを持っています。最初にアプリケーションが起動すると、データベースから読み取られたデータからリストビューが設定されます。ユーザーがボタンをクリックすると、データベースに挿入されるいくつかのデータをダウンロードする非同期コードが開始されます。非同期タスクが開始すると、progressdialogが表示されます。これをpostexecute()で終了します。データはうまくダウンロードされていますが、バックグラウンドジョブが完了した後、メインスレッドでカーソルを再クエリしてリストビューを更新するにはどうすればよいですか?android asynctaskは、postexecuteのリストビューを更新します。

メソッド "refreshRemoteData"は、メニューボタンから呼び出されます。

これは私のAsyncTaskの外観です。

public class MyActivity extends ListActivity { 

    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    } 

    public void onStart() { 
    myDBAdapter = new DBAdapter(this); 
myDBAdapter.open(); 
    populateMyList(); 
    } 

    private void populateMyList() { 
    myCursor = myDBAdapter.fetchAllItems(); 
    startManagingCursor(myCursor); 

    getListView().setAdapter(myDBAdapter);   
    } 

    private void refreshRemoteData() { 
    mPleaseWaitDialog = ProgressDialog.show(ExpirationDateTrackingActivity.this, 
    "Data", "Downloading data", true, true); 

download_task = new InfoDownloaderTask(); 
download_task.execute(); 
} 

    private class InfoDownloaderTask extends AsyncTask<Object, String, Boolean> { 
private static final String DEBUG_TAG = "InfoDownloaderTask"; 

    protected DBAdapter mylocalDBAdapter=null; 

    @Override 
    protected void onPreExecute() { 
    Log.e(DEBUG_TAG, "onPreExecute: "); 
     mylocalDBAdapter = new DBAdapter(this); 
    mylocalDBAdapter.open(); 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     Log.i(DEBUG_TAG, "onPostExecute: "); 
     mPleaseWaitDialog.dismiss(); 
     mlocalDBAdapter.close(); 
    } 

    @Override 
    protected Boolean doInBackground(Object... arg0) { 
     Log.v(DEBUG_TAG, "doInBackground"); 
     ///... 
     //Update the database 
     mylocalDBAdapter.insertData(....); 
     return true; 
    } 
} //AsyncTask 
} 

非同期操作が完了した直後に新しいリストデータでリストビューが更新されることはありません。しかし、リストビューに別のアティビティとカムバックを呼び出すと、新しいアイテム(リストの更新)がすべて表示されます。

私には何が欠けていますか?

答えて

1

mylocalDBAdapterでデータを挿入していますが、myDBAdapterについては通知していません。 onPostExecute()の末尾にmyDBAdapter.notifyDataSetChanged();を呼び出してみてください。

+0

Tedしかし、myDBAdapterのnotifyDataSetChanged()メソッドはありませんか? – Atarang

+0

テッドの提案が働いた。しかし、私は非同期タスクにlistViewAdapterを渡し、postExecute()のlistViewAdapter.notifyDataSetChanged()を呼び出さなければなりませんでした。 – Atarang

+0

@Atarangあなたはそれが働いてうれしい。受け入れてくれてありがとう。 –

関連する問題