2012-04-19 13 views
3

困った問題があります。 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を拡張します。

ありがとうございます!

+0

あなたの問題を解決しましたか? –

答えて

0

アダプタにnotifyDataSetChanged()を呼び出す必要があると思われ、アダプタが実装された後に表示されるように見えます。これはUIスレッドから呼び出される必要がありますので、postExecute()メソッドから直接呼び出されるコードに記述してください。

これが役立つ場合は、これを回答としてマークしてください。

+0

上記の私の最初の質問に注意しても、私はそれを試してみました。 notifyDataSetChanged()がArrayAdaptersに何らかの影響を与えるとは思わない。 – Nishmaster

1

データがArrayList<String>であれば、あなたはonCreate()このdata = new ArrayList<String>();に割り当て、これでアダプタを割り当てることができ、これはあなたがasynctaskを終えるまで、あなたは自分の価値観にデータを割り当てることができ、空のあなたのリストビューを維持し、アダプタに通知することデータはこのadapter.notifyDataSetChanged()で変更されました。

+0

残念ながら、データはオブジェクトの配列であり、getView()はダミーアイテムをロードするとすぐに処理を試みます。したがって、アダプタに送信されるデータにはnull値を渡すことはできません。 – Nishmaster

+1

@Nishmaster:AsyncTaskが終了するのを待っている間に、アダプタのデータを 'new ArrayList ()'に設定すると正常に動作します。限り、あなたの特定の問題として、私はダミーのプロジェクトにあなたのサンプルコードを入れ、それは一見問題なしで走った。私はあなた自身のプロジェクト(カスタムオブジェクトタイプとすべてを持つArrayAdapter)で記述しているものとほとんど同じものを実行していますが、この問題を見たことがなく、notifyDataSetChanged()で報告した問題もありませんでした。聞くのは楽しい答えではありませんが、おそらくエラーはあなたのコードのどこかにありますか? – CloudyMusic

関連する問題