前にもエントリしましたがちゃんとRecyclerView使ってみた。

大まかに見ると
レイアウト周りの動きなどはLayoutManager
レイアウトの見た目とかの調整はRecyclerView.ItemDecoration
データセットはRecyclerView.Adapter
って感じなのかな。
それとRecyclerViewはポジションとか座標とかでほしいものをとってこれるようになっている。
これだけはまぁ使いやすい感じでございます。

でも、RecyclerViewはあることをしようとすると面倒になってます。
まぁ単純にカスタムなアイテムだけで面倒ってことなんですが・・・

例えばアイテムクリック処理をしたい場合、setOnItemClickなどはないので以下の2パターンが良くあると思います。んでどちらもデメリットあります。

1.addOnItemTouchListener(RecyclerView.OnItemTouchListener)を使う。
*アイテムの範囲内なら全て呼ばれる。さらに各タッチ処理の前に呼ばれるので回避が。。。
ようは子ビューの中にボタンがあった場合、ボタンと合わせて呼ばれてしまうってこと。

2.Adapter内で子ビューに直接setOnClickListenerを実装する。
*該当のビューのより下のparent達にはイベントがこない。
なのでsetOnItemClickのように子ビュー全体でクリック判定したい場合でRecyclerView.setOnTouchListenerでやっていたらこれは呼ばれない。

RecyclerViewはまぁ大本がListViewを経由してないんでまぁここらへんはしょうがないのかなと。
setOnItemClick系のListenerも問題が多かったみたいでなくしたかったんだろうな。

んで、まぁこれだけならいいんですがこいつにSwipeToDismissを使ったり、子ビューにボタン入れたりを複合したい場合まぁ面倒。。
ちなみに普通にスワイプするならば偉大な開発者の方がRecyclerView用にSwipeToDismissのListener(SwipeDismissRecyclerViewTouchListener)を公開していたりします。

krossovochkin/Android-SwipeToDismiss-RecyclerView
https://github.com/krossovochkin/Android-SwipeToDismiss-RecyclerView

これはRecyclerView.setOnTouchListenerで実装するタイプのListenerですのでカスタムの場合にアイテムクリックが1しか使えんという。。。
*リスト全体をクリック判定しなくていいなら全然使えるんですがね。


なんでこいつをフォークしてaddOnItemTouchListenerでスワイプできるようにちょい修正してみますた。

addOnItemTouchListenerでスワイプするなら、
子ビュー全体にタッチ反応 & 各クリック系はAdapter内で実装で普通に反応。
もちろんバックグラウンドもステイタスで変えれるよ。
ってことで以前と同じような形に使えるので。
補足ですが、addOnItemTouchListenerのonInterceptTouchEventでtrue返すと全部止まっちゃうのでスクロースストップなんかはスワイプ開始と終了をコールバックしてその時に適宜行えるようにしています。

と書きましたが最後は投げっぱなしですいません。
以下にサンプルを置いておきますので見てみてください。
難しいことはしとりませんので。。。

https://drive.google.com/file/d/0B_niJgzazrXxT1pXc2YzNUp6Rk0/view?usp=sharing

*シンプルとカスタムがありますが
シンプルはクリックをaddOnItemTouchListener(RecyclerView.OnItemTouchListener)
スワイプを上で紹介したSwipeDismissRecyclerViewTouchListenerでやっとります。

あとAdapterは毎回作るの面倒なのでList用にRecyclerViewAdapterを継承したabstractなAdapter用意してます。AbsArrayBaseRecyclerViewAdapterってやつ。
基本的な部分は以前のArrayAdapterな感じに扱えるようにしてみましたよ。
AbsArrayBaseRecyclerViewAdapter RecyclerViewAdapterって