私のアプリには、2 種類のアイテムを含むリストを表示するために使用される ListView があります。現在実装されている方法は、項目タイプごとに 2 つの異なる XML レイアウトがあることです。アダプターはタイプを正しく報告し、getView() メソッドで、指定された位置のタイプに従って適切な XML を膨らませます。
問題は、ほとんどの場合、アイテムのリストの構造が、タイプ 1 アイテムのほとんどが最初にあり、タイプ 2 アイテムのほとんどが最後にあるということです。そのため、通常、最初はほとんどタイプ 1 が表示されます。下にスクロールすると、ある時点でタイプ 2 の項目が表示され始め、リストの最後まで続きます。
その中間点に達するまでスクロールしている間、すべて正常に機能します。その時点で、getView() へのすべての呼び出しで、convertView パラメーターとして null が渡されます。これは明らかに理にかなっています。問題は、ListView が以前のタイプ 1 のビューをすべてリサイクラーに格納しているように見えることです。これからはほとんどのビューがタイプ 2 のビューになるため、下にスクロールし続ける限り、それらを使用しません。
ビューは非常に複雑で、カスタムの背景とその上にビットマップがあるため、おそらく使用しないであろう多くのビューがメモリ内に存在することになります。
私の質問は 2 つあります。
私はそれについて心配する必要がありますか?今のところ、私は OOM 例外を取得する段階ではありませんが、そこに到達するか、またはリソースが逼迫したときにそれらのビューの一部を「手放す」のに十分なほど ListView がスマートですか?
私がそれについて心配する必要がある場合、明示的に ListView にリサイクラーをクリアするように指示したり、何らかの方法で無効にしたりする方法はありますか?
考えられる解決策は、両方のレイアウトに同じ XML を使用し、そこに 2 つの ViewGroup を配置し、そのうちの 1 つの可視性を GONE に設定することです。それ。