NO_NAME

適当に技術・仕事・ライフハックの話を書いていく予定です。

View拡張時のListViewによる落とし穴

AndroidのViewクラスには onFocusChanged(...) や onWindowVisibilityChanged(int) などのメソッドがあり、これらをオーバーライドすることで表示状態に応じて状態を切り替えることができる。
ただし、過信は禁物。

ListViewの中で使うとこれらのイベントは表示されているときにしか飛ばない。
そのため、onFoucusChanged や onWindowVisibilityChanged(int) で参照数をインクリメント、デクリメントしていると痛い目にあうので注意。
たとえば ListView の中に View A があるとする。
以下のような手順を踏むと、参照数だけが増えることになってしまう。

  1. View A が表示されないようなスクロール位置に移動。
  2. 別のアプリへ移動。非表示なのでonFocusChangedは実行されない。
  3. 自動更新などでスクロール位置がずれView Aが表示される。
  4. 別のアプリから戻る。onFocusChangedが実行される。

これは ListView の実装が悪いとは思うのだが、文句をいっても仕方がないので、ListView のスクロールを位置を監視して適切に View の状態を切り替えるようにするしかない。