スワイプで削除できるRecyclerViewを実装するときの悩み
RecyclerViewを使うときに必ず実装するであろうRecyclerAdapter。List<Hoge>
をRecyclerViewに表示するのに使う。
単にリストを表示するだけならあまり迷わないのだが、プラスアルファの処理を行う必要が出てきたときに私はよく悩む。例えば、現在進行形でもにょっているのが、リストのアイテムををスワイプしたらそのアイテムを削除したいというケース。とりあえず実装して動いてはいるのだが、削除に関するコントロール処理をどこに書くのが適切なのだろうかという疑問に対する明快な解を持ち合わせていない。
最近触っていないけど、FilteredHatebuというアプリでは削除に関する処理をPresenterに担わせた。Adapterは単にList<Hoge>
とRecyclerViewの橋渡しをするだけというシンプルな作りだ。
一方で、現在作っているアプリではAdapterで削除に関する処理を行っている。この2つの違いがなぜ生まれたかというと、AdapterがList<Hoge>
を持っているかどうかという問題に行き着く気がする。
RecyclerViewやListViewを使うとき、ネットで見かけるコードではAdapterにList<Hoge>
を持たせるものをよく見かける。コンストラクタを使って渡すなり、セッターを使うなりして、AdapterにList<Hoge>
をセットしてやる手法だ。単に表示するだけならこれで問題はないのだが、削除に関する処理を行おうとすると混乱し始める。
削除処理はList<Hoge>
のアイテムを削除する処理を内包する。RecyclerViewの2番めのアイテムがスワイプされたら、List<Hoge>
の2番めのHogeを削除しないといけない。ではその削除を実行するのは、AdapterなのかそれともActivityなのか、それとももっと他のもの(例えばPresenter)なのかがよくわからない。
List<Hoge>
の操作が必要なのだから、List<Hoge>
を管理しているものが削除すれば良い。となったときに、AdapterがList<Hoge>
を持っていることが多いので、そのままAdapterに削除処理を実装することが多いのである。
削除可能なRecyclerViewの実装について、ベストプラクティスが知りたい。そして知りたいと思ったときに、ふと「そもそもAdapterにList<Hoge>
を持たせるのはどうなんだろうか」と疑問に感じたのである。
私の理解では、AdapterはList<Hoge>
とRecyclerViewの橋渡しをするもの、つまりHoge
クラスを表示するためのViewに変換するのがその責務という認識だ。その認識からすると、AdapterにList<Hoge>
をもたせて削除に関する処理が加わっている今作っているAdapterは、AdapterではなくてControllerになってる気がする。
そんなことを考えていると、そもそもRecyclerViewでアイテムをスワイプして削除させるのが間違っているのではないかという気分にもなってくる。別にAdapterにどれだけの責務をもたせるかは、開発者のさじ加減であって、個人の好きなようにしたらいいのかもしれない。
そんな堂々巡りのはて、まあ動けばいいかという結論に落ち着く。削除可能なRecyclerViewの実装、みんなはどうやっているのだろう。