2014-03-06 72 views
0

我有一個片段對話框,其中包含設備上安裝的所有應用程序的列表。
有時加載需要一些時間,我想在加載時顯示ProgressDialog
我試過下面的代碼,並沒有任何好處:使用異步任務在Android中加載應用程序li​​stView和圖像

@Override 
public void onAttach(Activity activity) { 
    // Show progress dialog 
    showProgressDialog(activity); 
    super.onAttach(activity); 
} 

private void showProgressDialog(Activity activity) { 
    mProgressDialog = new ProgressDialog(activity); 
    mProgressDialog.setTitle(R.string.loading); 
    mProgressDialog.setMessage(getString(R.string.shared_options_wait_while_applist_loads)); 
    mProgressDialog.show(); 
} 

onCreate加載整個列表和應用程序的圖像,然後我用:

@Override 
public void onStart() { 
    stopProgressDialog(); 
    super.onStart(); 
} 

    private void stopProgressDialog() { 
     mProgressDialog.dismiss(); 
} 

現在的我我想在異步任務中加載整個列表,但我無法確定異步任務應該做什麼,它應該加載列表,但是如何等待列表並在列表準備就緒時獲得列表? (我相信是這樣的回調應該被使用?)

感謝

+0

您可以在'AsyncTask'類的'onPostExecute'方法上使用'UI',創建適配器並將其設置爲您的列表,您可以在'onPreExecute'上顯示'progressDialog',這兩個方法與' UI線程' –

+0

有什麼例子可以請你參考我?謝謝 – SagiLow

+0

如果你搜索,你可以找到很好的例子。你可以看到[this](http://developer.android.com/reference/android/os/AsyncTask.html)和[this](http://stackoverflow.com/questions/9671546/asynctask-android-example) –

回答

0

您可以通過添加一個DataSetObserver觀看適配器的數據集的改變。

@Override 
public void onCreate(Bundle savedInstanceSate){ 
    super.onCreate(savedInstanceState); 
    setContentview(R.layout.main_view); 
    ListView myList = (ListView) findViewById(R.id.my_list); 
    MyDataTypeAdapter adapter = new MyDataTypeAdapter(); 
    myList.setAdapter(adapter); 
    adapter.registerDataSetObserver(new DataSetObserver(){ 
    @Override 
    public void onChange(){ 
      //do stuff here 
    } 
    }); 
} 

這種方式onChange將在你的dataSet改變時加載,你可以在那裏下載你的圖像。

但是,我最好爲適配器中的每一行做一個AsyncTask,並獨立下載它的圖像。您也可以使用UniversalImageLoader庫來達到此目的。

+0

但我的適配器是用所有數據創建的(這是構造函數),我應該將它設置爲'null'並讓異步任務將項目逐個添加到適配器? – SagiLow

+0

在您的ListAdapter getView()方法中,您可以編寫一個asynctask來填充視圖的圖像。這樣,如果你沒有視圖,asynctask不會被觸發,但是當你這樣做時,它會加載視圖。此外,爲避免啓動太多的異步操作,請在開始下載之前檢查是否有圖像 – Makerhack