刺身の上にたんぽぽ乗せる日記

プログラミングしたり、自販機の下に落ちてる小銭を集めたりしてます

ListViewの変更

2つ機能を追加するためにすごく嫌なハックを加えた。

  • 検索ボタンを押したタイミングでListViewのTextFilterの編集開始+IME呼び出し
  • setMovementMethodにLinkMovementMethodをセットした際のスクロール停止をMotionEventのACTION_UPではなく、ACTION_DOWNで行う

両方ともListViewの拡張でどうにかした。

前者に関しては、

  • setFilterText(" ")で入力画面の表示
  • Filterable関連で文字列をtrimして空文字扱いする
  • Filterも自作して、trimする
    • prefix matchingでよければデコレータでいいと思う
  • getTextFilter()もoverrideしてtrimする
  • IME関連はInputMethodManagerから。ソフトウェアキーボードを出したかったけど、フィルタを入力しているViewがよくわからないので、とりあえずtoggleSoftInput使った

後者に関しては、

  • AbsListView.OnScrollListenerでscroll状態を管理する
  • Fling中のonTouchでActionがdownだったら、postでupのactionをdispatchTouchEvent()するRunnableをキューに入れる
    • upのイベントはあらかじめ作っておいたやつをそのまま毎回使えばいいと思う。
    • 座標(-1,-1)でupイベントみたいなやつで普通に大丈夫だった
    • 反応が完璧とは言いがたいけど、upのイベントでfling停止よりは自然な動作になると思う。

双方とも今後のandroidのライブラリの仕様変更で色々壊れそうな気がする...。