SwipeRefreshLayout r21はListViewじゃないとうまく動かない


悩まされたのでメモ。


この記事はQiitaブログのクロスポストです。愚痴が続くので結論から読むべきかも()


SwipeRefreshLayout

Google公式のsupport libraryにはr19(API19:Kitkat)からSwipeRefreshLayoutが入っています。いわゆる『引っ張って更新』を実装してくれるViewです。

このViewの内側には基本的にListViewやRecycleViewを入れます。

あるいは、それ以外のViewでも内包することが出来ます。

例えばその実装例としてGoogleの公式サンプルがあります。

SwipeRefreshMultipleViews | Android Developers


さて、ここまでSuppprt Librarry v4:r19の時の話でした。

r21

r21ではMaterial Desiginに合わせ、装い新たに生まれ変わりました。
GmailやGopgle+アプリで使われてますね。

さて、私はここで、「SwipeRefreshLayoutの内側で好きなViewが使える」この前例を信じ、r21でテキトーに作ってビルドしました。

結果、

ちゃんとリフレッシュメソッドは動いてるのに、あのぐるぐるが出てこない!!

これだけのことに私は散々悩まされました。数日間(長過ぎる)。コードがどこかおかしいのだろう、と。

ぐぐってみるとoffsetがどうのとかいったissueもあったけど関係ない話でした。
一瞬だけれども正しい位置に白い円が現れるのですから。

また、試しに内側のViewをListViewに差し替えてみたら、ちゃんとぐるぐるが現れました。これはもしや...

公式サンプルも...

ここで先程の公式サンプルの出番です。実は最初にこのサンプルのビルドを試みていたのですが、うまくいかず諦めていました。

今一度試行錯誤した結果、やっと動くようになりその検証ができました。 

まずr19のままでビルド。これはサンプルの意図した通りに動作していることが確認出来ました。

つづけてr21に替えたところ、なんということでしょう、先程と同様の問題が発生するではありませんか。


(もちろん同様に引っ張ってる状態ですよ!)

なるほど。

これ、ライブラリの問題じゃないか!

しょうもないことで悩んでた私は心が折れました...

とりあえずListViewを使えばいいと判明したので、今回は渋々それ用に書き換えることにしました...

結論

Android Support Library v4 r21のSwipeRefreshLayoutの子にはListView系Viewを使う必要がある!

これがバグか仕様かは知らないけれど仕様だと思って我慢します...

当該の使い方をしたい場合は旧バージョンを利用するか他ライブラリを利用するのが懸命っぽいですね。

それっぽいIssueあるけど結局よくわからない… Issue 78062 - android - SwipeRefreshLayout doesn't go away when fragment is changed while refreshing - Android Open Source Project - Issue Tracker - Google Project Hosting

何か知ってる人、あるいはいい案あったら是非教えてください!

--

ところでQiitaってチェックリスト使えるようになってたんですね!

  • SwipeRefreshViewを使う
  • Twitter4jを使う