今まで,ListViewで「選択」をどうやって扱うのかいまいちよくわからなかったので,TreeNoteでは基本的に「選択中」の情報は自前で管理している.カスタムAdapterにメンバー変数として選択中のノードIDを持っておき,getView()の中で色を変えているのである.
どうもListViewのselectedという状態はそもそも「タッチ操作モードだと使えない」ということであるらしい.公式の文章を読むと,「ListViewの項目を選択できるとしたら,どこか選択したままスクロールして選択中の項目が画面から消えたらどうするんだ? しかも,そこで選択中の項目に何か操作したら,表示されてないのにその項目について何か起こるのか?」とか書いてある.俺としては,表示されてなくても何か起こればいいだろとしか思えないんだが,そういうことじゃないんだろうか?
で,最近知ったのだが,俺が想定する「画面に出てようがいまいが保持される,項目の選択状態」というのは,むしろchecked状態のほうが近いようだ.ふつうはいわゆるラジオボタンやチェックボックスで表現されるが,別にCheckableをimplementsしたTextViewとかを自分で作れば,色が変わるとかアイコンが変わるとかでも表現できる.
ためしに,今回新しいブックマークマネージャーはこの方式で書いてみた.checkedだと色の変わるTextViewを作って,ListViewをSingleChoiceモードにしてある.全部自前で管理するより多少すっきりしたかもしれない.まあでも,TreeNoteのツリー表示本体については,選択状態以外にもやることがいろいろあるから結局getView()であれこれ設定する方式のままなんだけどね.
どうもandroidフレームワークはときどき俺の直観に反するつくりになっているけど,まあ俺が作ったわけじゃないししょうがないねえ.