我有一個相當令人費解的問題。如果我嘗試使用AsyncTask填充ListView,則該ListView的適配器上的getView()永遠不會被調用。請注意,這是活動啓動時此ListView的初始數據總量。 AsyncTask是需要的,因爲ListView是從HTTP填充的。ListView的適配器getView()不調用,如果填充後onCreate()
我有以下簡單的佈局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<ListView
android:id="@+id/transactionListView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="#CCCCCC"
android:dividerHeight="1px"
/>
</LinearLayout>
而一個基本的onCreate():
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mainListView = (ListView)findViewById(R.id.transactionListView);
this.populateListView();
}
,你可以看到來電:
private void populateListView()
{
populateListViewTask task = new populateListViewTask();
task.execute();
}
最後,的AsyncTask onPostExecute():
protected void onPostExecute(Void result)
{
lvAdapter = new CustomArrayAdapter(MainActivity.this, R.layout.listitem, data);
mainListView.setAdapter(lvAdapter);
}
當然,實際的實現比這更復雜一點,但是我沒有任何其他的錯誤來源,除了getView()沒有在上面的配置中被調用。如果在onPostExecute()中添加lvAdapter.getCount(),我會得到30(這是我所期望的,因爲實際代碼的HTTP/XML解析部分工作正常)。我也嘗試添加notifyDataSetChanged(),只是爲了微笑,但是顧名思義,CustomArrayAdapter就是擴展了ArrayAdapter。我也嘗試在視圖上invalidate(),也沒有效果。
但是,如果ALTER的onCreate()來調用的AsyncTask之前有像這樣一個單一的虛擬列表項:
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mainListView = (ListView)findViewById(R.id.transactionListView);
//Add dummy list item
TestDataStructure[] data = new TestDataStructure[1];|
data[0] = new TestDataStructure();
data[0].item = "Dummy List Item";
lvAdapter = new CustomArrayAdapter(MainActivity.this, R.layout.listitem, data);
mainListView.setAdapter(lvAdapter);
this.populateListView();
}
getView()隨後將在onPostExecute()調用後正確調用,ListView控件將使用AsyncTask中的新項目正確填充。我的直覺是,在最初的情況下,Android在Activity創建週期中確定了佈局中項目的結構和可見性,並決定了transactionListView因爲它是空的而不可見,從而阻止它在新的適配器時調用getView()已設置。
有關如何解決此問題的任何想法,而不添加虛擬列表項(當然,直到AsyncTask完成後纔可見)?我的活動擴展了Activity,而不是ListActivity。
謝謝!
解決了您的問題? – 2012-04-19 01:27:39