SwipeRefresh+AsyncTaskLoader の使い方

SwipeRefreshLayout を使うと、引っ張って更新することができるようになります。様々なアプリで見られる基本的な機能で、これ自体は簡単に実装できます。

今回は、ローダと一緒に使うところで少し詰まってしまったので (というかローダの再利用のところをいまいち理解していなかったので)、SwipeRefreshLayout で更新したときに AsyncTaskLoader を再利用し、CustomAdapter (ArrayAdapter) を使って ListView に反映するところまでをやりたいと思います。

スポンサーリンク

SwipeRefreshLayout の実装

Gradle

予め build.gradle にサポートライブラリを読み込んでおきます。バージョンのところは適宜合わせてください。

以前は compile だったようですが、廃止されて現在は implementation となっています。また、バージョンのところで 21.0.+ と書くと (記憶の限りでは) 怒られるので、厳密に指定する必要があるっぽいです。

XML

SwipeRefreshLayout は内部に ListView か GridView を一つだけ持つことができます。

Java

TabLayout を使ったので Fragment で作っていますが、Activity でも大して変わらないと思います。

いくつかのサイトで紹介されていた setColorScheme() は既に廃止されていて、ID で指定する場合は setColorSchemeResources() を使います。使いたい色は [res] > [values] ディレクトリの color.xml に 16 進数の RGB で記述しておく必要があります。

更新時の動作は onRefresh() 内に記述します。

AsyncTaskLoader の処理

ローダ側で既に loadInBackground() は実装しているものとします。ネットワークに繋いでニュース記事を取得するなど、遅延が発生する処理はここに書いておきます。

メインスレッドでやろうとするとコンパイルエラーかなんかで弾かれます。

restartLoader()

ローダを再利用するときに同一の ID を指定して restartLoader() を使うと、onCreateLoader() が呼ばれます。initLoader() は ID に対して一回しか使えません。二回目以降は onCreateLoader() が呼ばれないからです。

ArrayAdapter と ListView の処理

onCreateLoader で return new CustomLoader() し、処理が終わると onLoadFinish() が呼ばれるので、そこに ListView を更新する処理を書きます。

CustomAdapter は ArrayAdapter クラスを継承しています。

notifyDataSetChanged() がないと ListView が更新されないという話が合ったので書いてますが、実際どうなのかはわかりません。これはアダプタに対して clear() や add() してないと呼ぶことができないようです。

setRefreshing(false) を呼ぶことで、アニメーションが終了します。これがないと、更新が終わっても回り続けます。更新ボタンを押したときに setRefreshing(true) になるような実装をすれば、引っ張らずとも更新できそうです。

(参考)

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください