石の上にも数年

yaplog! のサービス終了に伴い引っ越しました 🚚

ListView本体の縦幅を無理やり高く設定するとどうなるのか?(Android)


ListViewの縦幅を無理やり
「セルの縦幅×セルの数」
に設定するとどうなるのか

ListViewのxml
android:height="match_parent"
または
android:height="wrap_content"
を設定しておけば普通
そんなことはできませんが、
javaファイルからListViewの高さを
「セルの縦幅×セルの数」に無理やり変更し
スクロールにも対応した実装を作成しました。

結果はメモリが足りなくなりスクロールと
表示の動作がすごく遅くなりました。
もしもリストの項目が多い場合には
アプリが強制終了する可能性も…。
これではListViewを使う意味がなくなってしまいます。

ListViewはディスプレイに表示されていない
部分のセルをメモリから解放するのですが、
リストの縦幅を「セルの縦幅×セルの数」分サイズ取ってしまうと
ListViewのセルを全部表示してしまうことになるので
例えばリストの項目が1000個存在する場合には
ディスプレイに表示されていない部分の
セルがメモリから解放されない事になってしまいます。

結論:ListViewの縦幅は常識的な高さにするべし

Q:そもそも何故ListViewの縦幅を無理やり変更するという行為に至ったのか
A:「Pinterest」や「Google Keep」アプリの様に段違いになる2列リストにヘッダーを入れるレイアウトを作りたかったからです

段違いになる2列リストの上にヘッダーのレイアウトを置き
画面全体をスクロールさせることで「Pinterest」っぽいレイアウトを
再現しましたが、上記のようにメモリが開放されなくなるのでダメでした。

調べると段違いになる複数列リストにヘッダーとフッターを追加できるライブラリが存在しました。
AndroidStaggeredGrid

Android 5.0 からはマテリアルデザインでライブラリ無しで実現できるようにならないでしょうか