1

の中にListViewあるがありTabHostます。CursorAdapter4つの異なるビューをリストに返す習慣があります。4つのタイプの1つは、SDまたはアセットフォルダーからプルされたイメージです。もともと私はCursorAdapterそれ自体から画像を読み込んでいましたが、これにより各画像の読み込み中にUIスレッドがハングするため、コードをに移動しましたAsyncTask

これは、非常に短いアイテムのリストが返される場合を除いて、すべて機能します。これが発生した場合ListView、画像が読み込まれた後はサイズが変更されず、画面上部のごく一部でしかスクロールできません。

リレーアウトを取得する方法がわかりませんlistView。ビュー自体でrelayoutを呼び出して無効化することはできません。ビューの親を見つけようとすると、nullが返されます。デフォルトのListFragmentレイアウトでは、高さがすでに「Match_Parent」に設定されています。onCreateViewのレイアウトを、すべての高さが「Match_Parent」に設定されたレイアウトに手動で設定しても、修正されません。アダプター自体を呼び出しに渡すとnotifyDataSetChanged()、ループが発生するだけで、サイズは変更されませんListView

イライラすることに、タブを変更すると、新しいタブがその上に描画される直前にビューが正しく点滅します。非常にまれに、デバイスを回転させたり、タブ間をフリックしたりすると、正しくレンダリングされますが、ほとんどの場合、正しくレンダリングされません。

デバッグの目的で、onListItemClickにさまざまなrelayoutコマンドを追加しようとしましたが、ListView.relayout()を呼び出すと問題が解決する場合がありますが、多くの場合は解決しません。

左側はAsyncTaskでのロード方法、右側はメインスレッドローダーでのロード方法です。コンテンツは左側にありますが、リストビューのサイズが正しくないため、スクロールする必要があります。

私は何が欠けていますか?ListViewまたは現在のタブ、さらには画面全体を再描画する方法はありますか?

4

2 に答える 2

1

自分自身を再描画するには、ListViewに通知する必要があります。これは高価であり、避けるようにしてください。また、スクロール位置が変化し続けるため、ユーザーにフラストレーションを与える可能性があります。理想的なImageViewサイズを見つけて、それを使用して行の高さ/幅をロックし、動的コンテンツがこれらの問題を引き起こさないようにすることをお勧めします。

http://developer.android.com/reference/android/widget/ArrayAdapter.html#notifyDataSetChanged()

arrayAdapter.notfityDataSetChanged();

それはそれをする必要があります。

于 2013-03-27T04:44:57.537 に答える
0

この問題は、ListViewがレイアウトされた後のImageViewのサイズ変更が原因で発生します。AsyncTaskをスピンオフする前に、ImageViewの高さと幅を画像のサイズに設定すると、ListViewのレイアウトが正しくなります。

私の画像はすべてローカルであり、ファイル名などがデータベースに含まれているため、画像を読み込む前に正しいサイズを取得できます。事前に画像のサイズを取得できなかった場合、私はあなたが何をするかを100%確信していません。

于 2013-03-27T23:36:00.973 に答える