RecyclerViewのマルチセレクションをActionModeと一緒に利用する(途中経過)

Last Update: 2019-07-19

あまりにAndroidネタを書いていないので、たまにはAndroidの話を書こうと思う。

RecyclerViewのアイテムを任意で複数選択し、その選択したアイテムに対して何らかのアクションを実行するのを試してみている。自分のアプリに組み込もうと思ったのだが、いきなり導入するにはAndroid Developersの情報では一体どうしたらいいのかさっぱりわからなかった。

こういうときは専用プロジェクトを作って使い方を試すのが私のやり方。サンプルプロジェクトを作ったのでその話を書こうと思う。

ちなみにこの記事ではコードの話は一切ない。とりあえずそれっぽく動くが、未だに動きに納得できていないし、やっぱり理解しきれていないのが大きい。

参考にしたところ

我らがAndroid Developers

Mediumの記事(A guide to recyclerview-selection)

おもにMediumの記事を参考にした。

サンプルプロジェクト

そもそも利用するandroidx.recyclerview:recyclerview-selectionがまだアルファ版(今使っているのは1.1.0-alpha06)なので、ライブラリの問題なのか私の実装の問題なのか切り分けられていない不具合がある。とりあえず動くよってだけの状態なので、あまり参考にはならないかもしれない。

やりたいこと

  • RecyclerViewで表示するアイテムを複数選択して選択したアイテムをいっきに削除したい
  • ActionModeによって削除モードに入って、そこから削除したいアイテムを選ぶようにしたい

現状

問題その1

本当はActionModeを起動しないとアイテムを選択できないようにしたいのだが、アイテム長押しするとマルチセレクションが始まってしまう。本当はこちらのフローは無効化したい。

今は複数選択モードに入ったらActionModeを起動してしのいでいる。ちなみにこちらのフローでは理想的な動きをしている。

実際にはこっちのフローは動かないようにしておきたいところだが、別に動いても問題ないからいいか・・・という感じである。

問題その2

ActrionModeを起動したら、アイテムをクリックしたら選択できるようにしたい。だが、現状では最初の1つめのアイテムを選択するのにロングタップが必要である。以降はシングルタップでアイテムを選択できる。

selectionライブラリ側で、アイテム選択モードのようなものが存在しているのかと思ったが、どうもそういうのはないらしい。

参考にしたMediumの記事では「現段階で細かいカスタマイズしたいなら、自分でSelectionTracker作るしかないよ」ということらしい。こちらの対策はまだ実行できていない。

そのへんカスタマイズ可能なようにしてくれよというissueは立ててみた。私の英語力で伝わっているのかは不明であるが。ActionMode起動したら最初からシングルタップでアイテム選べるようにする手段を提供してくれ、というissueを立てたつもりである。

問題その3

何回か動かしているとクラッシュする。Meidumの記事いわく、StableIdKeyProviderをそのまま使ってるから落ちてるっていうことらしい。クラッシュしているときのログを見るとそうなんだろうと思う。

ただなぜStableIdKeyProviderがクラッシュするようなことになっているのか、再現手順がいまいち把握できておらず、こちらは未解決のままである。

なぜ途中経過

時間が取れないからというのが一番大きい。途中経過の段階の雑な記事を書いているのは、これ以上時間開けるとやりたいことやら忘れてしまいそうだから書いている。

あとはすでに詳しい人からなにかアドバイスもらえたらなという打算もあったりするけれど。

そもそもActionModeもまともに使うのははじめてだったりするので、こちらの実装方法もあっているのかよくわからない。

とりあえず作っただけの状態で止まってしまっているが、やりたいことと現状を備忘録として残しておく。