サンプルも無いしドキュメントも断片的すぎエスパーきぼんぬ
どうもざっと見た感じでは、テキストの部分一致検索専用の機能があって、検索キーワードはsetFilterTextで設定して、被検索側はconvertToStringまたはsetCursorToStringConverterを使ってカーソルから被検索文字列を生成しなさい的な話かと思った
もう一つは runQueryOnBackgroundThreadまたはsetFilterQueryProviderで、こっちは検索キーワードが設定されるとクエリを再発行して新しいカーソルを返しなさい的な話と認識した
前者は要するにテキスト検索、後者は種別とかで絞り込むのに使うんかいね
あ、一つ目のはsetStringConversionColumnで検索対象になるカラム(大抵は本文)を指定もできるみたい?コンストラクタの時点でカーソルは来るからここでセットしてしまえばいいのかな。これが簡単そう。でもno caseな検索したいとか言い出すと急にめんどくさくなるなこれ
SimpleCursorAdapter and ListView.setTextFilterEnabled() – Android Developers | Google グループ
ちがうくさい。しょぼん
要するに「ああ、その機能動いてないから。runQueryOnBackgroundThreadとかFilterQueryProviderとか使うといーよ」らしい。
そんなことドキュメントには見当たらないんですがー…
更にconvertToStringも試してみたが、ブレークポイント仕掛けてんのに通りすらしねえ
あとなんかgetFilterってそれっぽいメソッドもあるけどsetFilterはなし。なんなのこれ
ドキュメントをFilterで引っ張ってもandroid.widget.Filter以外はインテントフィルタばっか引っかかる
なんやらさっぱりだ。setFilterとかするんじゃなくて、自分で作っておいてAdapterのgetFilterを継承して返せみたいな話かいね?
つらつら読んだ。どうもそうっぽいなぁ。
Adapterの内部にFilterの子クラスを作ってgetFilterで返す。
Filterクラスはフィルタ処理が開始した時点で(UI以外のスレッドから)performFilteringが呼び出され、任意のフィルタ処理を行ってFilterResultsに任意のデータを載せて返す。
その後、UIスレッドでpublishResultsが呼ばれるのでAdapterに反映させる。
みたいな。
はー、分からん。ConvertStringうんぬん系は全く動かない。使い方が何か足りないのか、そもそも動かないのかも分からない。とりあえず横に置くことにする。
一応runQueryOnBackgroundThreadの方は想定通りの挙動をするようなのでこっちで頑張るとしましょうか。
んー、まあ、だいたいわかった(もやし風に)
つまるところ、中間一致のクソLIKE検索をSQLiteに押し付けろ、みたいな話になると理解した。
まあどっちにしても誰かが中間一致のベタ検索はせざるを得ないんだからそれでいいような気がする。
で、LIKE検索で頑張ってみた。
うまくいった。
てかうまくいくに決まってんじゃん。インターフェースがクソなだけダメじゃん。
結論。Filter sucks