Android ViewにPull to Refreshを導入する


導入

android.support.v4.widget.SwipeRefreshLayoutを使用する。

サポートライブラリを指定せず、<SwipeRefreshLayout></SwipeRefreshLayout>と記述すると、Error inflating class SwipeRefreshLayoutとなり、ビルドは通るがXMLパースでコケる。

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/swipe_refresh_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>

この記述だけで入れ子にしたViewを引っ張る動作と連動したインジゲーターが表示できる。

pullされた時の処理を記述する

onRefreshListenerを登録することで処理をセットできる

swipe_refresh_layout.setOnRefreshListener {
    doAction()
}

処理後インジゲーターを非表示にする

ただし、layoutに定義しただけだと、インジゲーターが表示され続ける。よって、コード側でインジゲーターを消す処理を記述する。

swipe_refresh_layout.setOnRefreshListener {
    doAction()
    swipe_refresh_layout.isRefreshing = false
}

注意点

SwipeRefreshLayoutはLayout内で記述された先頭のViewのみしか表示しない。よって以下のように記述した場合、下のTextViewが表示されない。

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/swipe_refresh_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <LTextView
        android:id="+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>