Android開発メモ
最近apiドキュメントを見て、いくつかのadapterがFilterableを実装していて、ListViewにもsetFilterTextなるものがあることに気付いたので、今まで自力で実装していたfilterをandroid風に変えてみた。
最初はWrapperListAdapterでAdapterのラッパーを書いていたんだけど、
http://developer.android.com/reference/android/widget/WrapperListAdapter.html
何故かWrapperListAdapterとSectionIndexerを継承したフィルタが、fast scroll時にCastのExceptionで死ぬので、しょうがなくBaseAdapterベースで抽象フィルタクラスを書いた。
intの配列作って、フィルタを通ったn番目のitemは実Adapterのm番目のitemという対応表を持っているだけの割と汎用的に使える*1感じ。
あと、フィルタがデフォルトだとforward matchingなので、Filterを自分で実装した。matching処理自体はリストの要素依存なので、template methodにしておいた。
ちなみに、レスの>>50-100の表示の処理もAdapterのWrapperで処理してる。
レス表示は、キーワードフィルタ -> レス表示範囲フィルタ -> 実際のデータ、という三重構造になってる。
で、使ってみた感想。
- 体感速度が良くなった気がする
- これはとても重要。
- フィルタ処理がasyncだから?関係あるの?
- できれば検索ボタンを押した時にポップアップを出して、「フィルタできるよ!」というのを明示的に示したいんだけど、変なハックをしないとできないっぽい
- しょうがないからハックで解決するか...。
今更気付いたけど、スクロールで勢い良く飛ばして慣性で流れてる時に、指で止めるには、mouse down*2で止まるんじゃなくて、mouse upで止まるのね。BB2Cと2tchともmouse downだよなぁ。うーん。
BB2Cも2tchもスクロールがスムーズなんだけど、どうやったら同じくらいスムーズに動くのかなぁ?
追記:
mouse upで止まるのは、多分long clickの設定したからだ...