困った問題があります。 ListViewにAsyncTaskを設定しようとすると、そのListViewのアダプタのgetView()が呼び出されることはありません。これは、アクティビティの開始時に、このListViewの初期データ集団です。 AsyncTaskは、ListViewがHTTPから生成されるときに必要です。onCreate()の後に実装されたListViewアダプタのgetView()は呼び出されません
私は、次のシンプルなレイアウトがあります。
<?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()を:
private void populateListView()
{
populateListViewTask task = new populateListViewTask();
task.execute();
}
そして最後に、AsyncTask:あなたが電話を見ることができます
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mainListView = (ListView)findViewById(R.id.transactionListView);
this.populateListView();
}
onPostExecute():
protected void onPostExecute(Void result)
{
lvAdapter = new CustomArrayAdapter(MainActivity.this, R.layout.listitem, data);
mainListView.setAdapter(lvAdapter);
}
実際の実装はそれよりも少し複雑ですが、私は上記の設定でgetView()が呼び出されていないこと以外は、他のエラーの原因を排除しました。 onPostExecute()でlvAdapter.getCount()を追加すると、実際のコードのHTTP/XML解析部分が正しく機能しているので、30が得られます(これは私が期待しているものです)。私もnotifyDataSetChanged()を追加しようとしましたが、ちょうどgrins、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はアクティビティの作成サイクル中にレイアウト内のアイテムの構造と可視性を判断し、空であるためtransactionListViewが見えないと判断し、新しいアダプタが見つかったときにgetView()設定されています。
ダミーリスト項目を追加せずにこれを修正する方法については、AsyncTaskが終了するまで表示されます)私の活動は、ListActivityではなくActivityを拡張します。
ありがとうございます!
あなたの問題を解決しましたか? –