2011-05-11 176 views
14

我想知道我應該如何實現一個ListAdapter異步加載其視圖到ListView?我想這樣做是因爲我使用來自數據庫的信息來填充列表,這使得我的活動時間有點慢。如何異步填充列表視圖?

回答

18

您可以使用AsyncTask並使用onPostExecute方法來發布十歲上下的新加載的結果:

private ArrayAdapter adapter = new YourArrayAdapter(); 

private class YourAsyncTask extends AsyncTask<Void, Void, List<YourItem>> { 

    @Override 
    protected void onPreExecute() { 
     // start loading animation maybe? 
     adapter.clear(); // clear "old" entries (optional) 
    } 

    @Override 
    protected List<YourItem> doInBackground(Void... params) { 
     // everything in here gets executed in a separate thread 
     return DataBase.getItems(); 
    } 

    @Override 
    protected void onPostExecute(List<YourItem> items) { 
     // stop the loading animation or something 
     adapter.addAll(items); 
    } 
} 
+0

謝謝!當我明天回去工作時,會嘗試這個:)沒有想過這樣做 – 2011-05-11 17:31:08

+0

嗨,什麼樣的適配器可以清除或添加項目? – Hamidreza 2014-08-11 12:19:56

0

使用AsyncTask.這可以幫助您在後臺檢索數據。

+0

我用AsyncTasks頻繁,但我怎麼落實到一個listadapter?我正在嘗試創建一個列表,在完成加載時顯示一個視圖。使用asynctask設置listadapter將在後臺加載整個列表,然後顯示信息。我正在尋找一次加載一個列表項並將其顯示在列表中的實現。 – 2011-05-11 17:13:53

3

最簡單的就是使用的AsyncTask做加載並調用publishProgress爲每個項目被加載(或者,如果要加載的所有項目,並讓它們出現一次全部,更新UI中onPostExecute

1

.notifyDataSetChanged()可能是你在做什麼之後?每次向列表中添加一個支持ArrayAdapter的新項目時,都可以在該適配器實例上調用.notifyDataSetChanged()來告訴它刷新。逐漸建立並顯示添加到列表中的每個項目。

5

我到目前爲止看到從CommonsWare最好的辦法。它被發現在這個相關的answer

public class AsyncDemo extends ListActivity { 
    private static final String[] items={"lorem", "ipsum", "dolor", 
             "sit", "amet", "consectetuer", 
             "adipiscing", "elit", "morbi", 
             "vel", "ligula", "vitae", 
             "arcu", "aliquet", "mollis", 
             "etiam", "vel", "erat", 
             "placerat", "ante", 
             "porttitor", "sodales", 
             "pellentesque", "augue", 
             "purus"}; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    setListAdapter(new ArrayAdapter<String>(this, 
         android.R.layout.simple_list_item_1, 
         new ArrayList<String>())); 

    new AddStringTask().execute(); 
    } 

    class AddStringTask extends AsyncTask<Void, String, Void> { 
    @Override 
    protected Void doInBackground(Void... unused) { 
     for (String item : items) { 
     publishProgress(item); 
     SystemClock.sleep(200); 
     } 

     return(null); 
    } 

    @Override 
    protected void onProgressUpdate(String... item) { 
     ((ArrayAdapter<String>)getListAdapter()).add(item[0]); 
    } 

    @Override 
    protected void onPostExecute(Void unused) { 
     Toast 
     .makeText(AsyncDemo.this, "Done!", Toast.LENGTH_SHORT) 
     .show(); 
    } 
    } 
}