問題
ビットマップと、各位置で複数回 getView() を呼び出すリストビューの動作に問題があります。
私のリストにはビットマップのみが含まれており、リモートの場所から非同期に取得しています。ここで、リストビューが表示されると、getView() が各位置に対して (スクロールなしで) 約 4 回呼び出されるため、同じ位置に対して 4 つの異なるビットマップ インスタンスがインスタンス化され (そして 1 つだけを使用します...)、これによりアウトが発生します。メモリエラーの。
私が試したこと
私はすでにビットマップキャッシュを持っていますが、これは最初に画像を取得する前に発生します。たとえば、listView が開かれ、位置 0 のビットマップに対して 4 つの要求が行われ、これが到着すると、ビットマップがキャッシュに保存されます。この後、問題は解決しました。しかし、私の問題は、初めて 4 つのビットマップを作成することです (アイテム 0、アイテム 1、アイテム 2、アイテム 3 -> 16 個のビットマップ、そして 4 つだけ必要でした)。
「待機中」のimageViewのリストを実装し、1つだけをフェッチしてから、待機中のすべてのイメージビューにビットマップを設定するなど、これを解決するためのいくつかの戦略をすでに試しましたが、これにより新しい問題が発生し、同期も困難です。
また、リストビューの既にフェッチされた位置を含むリストフィールドを追加しようとしました.1回だけフェッチして設定するために、getView()は毎回異なる画像ビュー(など)を生成するようです(私はconvertViewをリサイクルしていますが、とにかく)、空の位置で終了するためです(ただし、すべてのビットマップがフェッチされ、インスタンス化され、イメージビューの1つに設定されます)。これを解決するために、位置を ImageView のリストにマップするマップ フィールドを使用し、1 つの位置を要求するすべての imageView にビットマップを設定しました。動作するはずですが、動作しません。ほとんどの位置で正しいビットマップを取得しますが、たとえば、リストの最初の位置では、最後に表示された位置からビットマップを取得します (すばやく切り替えられることがわかります。最初に位置 0、次に 1 からビットマップが表示されます。次に 2、次に 3 (最後に表示された位置)。
私の頭に浮かぶ別の可能性はありますが、(他の解決策と同様に)ひどい解決策のように感じますが、ビットマップをプリフェッチすることです。リストがスクロールする前に、次のxビットマップがキャッシュにあります。これは scrolllistener と組み合わせて実装され、スクロールによって次の x 個のアイテムがフェッチされ、キャッシュに入れられます。そのため、リストが getView() を呼び出すと (どんなに頻度が低くても)、キャッシュから同じプリフェッチされたビットマップ インスタンスが常に取得されます)。
Web から取得したビットマップを含むリスト/グリッド ビューは非常に一般的であるため、この問題を抱えているのは私だけではありません...
解決策はありますか?前もって感謝します。