Try the Compose way  
Jetpack Compose is the recommended UI toolkit for Android. Learn how to pull to refresh in Compose.  
[Pull to refresh in Compose →](https://developer.android.com/develop/ui/compose/components/pull-to-refresh)  
![](https://developer.android.com/static/images/android-compose-ui-logo.png)

The swipe-to-refresh user interface pattern is implemented entirely within the[SwipeRefreshLayout](https://developer.android.com/reference/androidx/swiperefreshlayout/widget/SwipeRefreshLayout)widget, which detects the vertical swipe, displays a distinctive progress bar, and triggers callback methods in your app. Enable this behavior by adding the widget to your layout file as the parent of a[ListView](https://developer.android.com/reference/android/widget/ListView)or[GridView](https://developer.android.com/reference/android/widget/GridView)and implementing the refresh behavior that is invoked when the user swipes.

This page shows how to add the widget to an existing layout. It also shows how to add a refresh action to the action bar overflow area so that users who can't use the swipe gesture can trigger a manual update with an external device.

## Add SwipeRefreshLayout dependency

To use`SwipeRefreshLayout`in your app, add the following dependency to your`build.gradle`file:  

### Groovy

```groovy
dependencies {
    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01"
}
```

### Kotlin

```kotlin
dependencies {
    implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01")
}
```

## Add the SwipeRefreshLayout Widget

To add the swipe-to-refresh widget to an existing app, add`SwipeRefreshLayout`as the parent of a single`ListView`or`GridView`.`SwipeRefreshLayout`only supports a single`ListView`or`GridView`child.

The following example demonstrates how to add the`SwipeRefreshLayout`widget to an existing layout file containing a`ListView`:  

```xml
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swiperefresh"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
```

You can also use the`SwipeRefreshLayout`widget with a[ListFragment](https://developer.android.com/reference/androidx/fragment/app/ListFragment). If the layout contains a`ListView`with the ID`"@android:id/list"`, the swipe-to-refresh functionality is automatically supported. However, explicitly declaring the`ListView`this way supersedes the default`ListFragment`view structure. If you want to use the default view structure, override parts of the`SwipeRefreshLayout`and`ListFragment`behavior.

## Add a refresh action to the action bar

Add a refresh action to your app's action bar so users who can't perform swipe gestures can trigger a manual update. For example, users with accessibility needs can trigger action bar actions using external devices, such as keyboards and D-pads.

Add the refresh action as a menu item, rather than as a button, by setting the attribute`android:showAsAction=never`. If you display the action as a button, users might assume the refresh button action is different from the swipe-to-refresh action. Making the refresh action less conspicuous in the action bar encourages users to perform manual updates with swipe gestures while maintaining the accessible option where D-pad users look for it.

The following code demonstrates how to add the swipe-to-refresh action to the overflow area:  

```xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/menu_refresh"
        android:showAsAction="never"
        android:title="@string/menu_refresh"/>
</menu>
```