2011-05-11 85 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(); 
    } 
    } 
}