UI + UX Cross-Device And Physical Interaction standard

Pull to refresh

Constrain pull-to-refresh to the top of the relevant scroll container, show pull progress and release threshold, run one scoped refresh request at a time, preserve existing content and position, expose status messages and last-updated copy, and provide an equivalent manual refresh control.

Decision first

Choose this pattern when the problem matches

Use when

  • A top-of-list gesture is a platform-expected shortcut for checking freshness on a scrollable data surface.
  • The content can remain useful while a refresh request runs.
  • The product can provide an equivalent manual refresh control and honest status feedback.

Avoid when

  • The surface is not scrollable or does not have a clear top boundary.
  • Data freshness must be automatic, real-time, scheduled, or explicit through a visible command rather than hidden behind a gesture.
  • The action changes data destructively, submits work, resets configuration, or has consequences beyond refreshing current content.
  • Nested scroll, map panning, row swipe, or drag behavior cannot be resolved predictably.
  • The product cannot preserve content, focus, and state during refresh.

Problem it prevents

Users on scrollable, freshness-sensitive surfaces need a lightweight way to check for newer data, but a hidden vertical gesture can conflict with scrolling, nested views, offline state, duplicate requests, and accessibility unless the refresh contract is explicit.

Pattern anatomy

What a strong implementation has to make clear

User need

The surface is a feed, inbox, notification center, activity list, dashboard, timeline, or status list where users expect newer server data.

Pattern promise

Constrain pull-to-refresh to the top of the relevant scroll container, show pull progress and release threshold, run one scoped refresh request at a time, preserve existing content and position, expose status messages and last-updated copy, and provide an equivalent manual refresh control.

Required state

Idle state with current content visible and last updated timestamp when freshness matters.

Recovery path

A feed refreshes while the user is reading older content in the middle of the list.

Access contract

Provide a manual refresh command that does not require a path-based gesture.

Quality bar

The difference between expert and weak execution

Strong implementation

Specific, visible, recoverable

  • A mobile inbox at the top of the message list shows Pull to refresh, Release to refresh, Refreshing, Last updated 10:42, and a Refresh menu item that runs the same request.
  • A field dashboard keeps cached cards visible during refresh, disables duplicate refresh, announces No new updates, and shows a Retry refresh action after a failed request.
  • A user reaches the top of a notifications list, drags down, sees the pull distance cross threshold, releases, and the list updates while older items stay in place.
  • A keyboard user opens the overflow menu, chooses Refresh, and hears the same refreshing and last-updated status as the touch gesture.
Weak implementation

Vague, hidden, hard to recover from

  • A feed refreshes from any scroll position, causing accidental network calls while users read older content.
  • A list clears all rows during refresh, spins forever when offline, and has no manual refresh path.
  • A user tries to scroll up inside a nested comments panel and accidentally refreshes the whole page.
  • A user pulls repeatedly while the previous refresh is still pending, creating duplicate requests and jumping the list.
UI guidance
  • Show pull-to-refresh only at the beginning of scrollable content, with a clear pull distance, threshold, release-to-refresh state, refreshing indicator, and completion status tied to the current data set.
  • Keep a visible or menu-based manual refresh action for keyboard, switch, assistive pointer, external device, and users who do not discover or cannot perform the gesture.
UX guidance
  • Use pull-to-refresh when users expect to check for newer content in a feed, inbox, list, dashboard, or status surface without leaving their current place.
  • Preserve scroll position, existing content, item identity, focus, and cached data while the refresh runs; never use the gesture as the only path to data freshness or as a hidden destructive action.
Implementation contract

What the implementation must handle

States

  • Idle state with current content visible and last updated timestamp when freshness matters.
  • Scrolled-not-at-top state where upward scroll does not arm refresh.
  • At-top armed state that can begin measuring downward pull distance.
  • Pulling-under-threshold state with progress feedback and no request started.

Interaction

  • Pull-to-refresh begins only when the intended scroll container is at its top boundary and the user drags downward beyond normal scroll tolerance.
  • The indicator shows progress toward a defined threshold before refresh starts.
  • The refresh request starts on release after threshold, not merely on touch down or incidental overscroll.
  • Releasing before threshold cancels the gesture and leaves data unchanged.

Accessibility

  • Provide a manual refresh command that does not require a path-based gesture.
  • Expose Refresh, Refreshing, Refreshed, No new updates, Offline, Failed, and Rate limited states through text and status messaging.
  • Do not move focus simply because refresh begins; keep focus stable unless the user activated a manual control that has a clear result target.
  • Keep refresh controls reachable by keyboard, switch, screen reader, external keyboard, and assistive pointer devices.

Review

  • Which exact scroll container owns the pull, and how do you know it is at the top?
  • What pull distance and threshold tell users when release will refresh?
  • What visible and announced status proves refreshing started, succeeded, found no new data, failed, or was blocked offline?
  • Where is the equivalent manual refresh path for users who cannot or do not perform the gesture?
Interactive lab

Inspect the states before you copy the pattern

Refresh a top-of-scroll data set

Inspect idle, at top, pulling, threshold, release to refresh, refreshing, success, no new data, failed, offline, nested scroll, rate limited, manual refresh, and mobile compact states; compare anywhere pull, no indicator, double refresh, eats scroll, offline spin, destructive refresh, and hidden manual failures.

Pull to refresh
Interactive demo is ready

Launch the live UI/UX lab when you want to inspect states, keyboard behavior, and common failure modes.

State To Inspect

Idle state with current content visible and last updated timestamp when freshness matters.

Keyboard / Access

Keyboard users can reach a Refresh action in a toolbar, overflow menu, command area, or near the list header.

Avoid Generating

Making pull-to-refresh the only way to update the data.

Evidence trail

Source-backed claims behind this guidance

Full agent/debug reference

Problem Context

  • The surface is a feed, inbox, notification center, activity list, dashboard, timeline, or status list where users expect newer server data.
  • The content already scrolls vertically, and the refresh gesture begins only when the relevant scroll container is at its top boundary.
  • The same content may also support nested scrolling, search filters, pagination, offline cache, live updates, load-more, or retry after failure.
  • Users may interact through touch, mouse, keyboard, switch control, screen reader, external keyboard, D-pad, or assistive pointer devices.

Selection Rules

  • Choose pull to refresh when the design problem is the vertical top-of-scroll drag that refreshes the current data set.
  • Use touch gesture when the question is the broader gesture vocabulary, threshold, feedback, and fallback contract across many touch actions.
  • Use feed, activity feed, notification center, dashboard layout, or list view when the primary problem is stream structure, ordering, unread state, filtering, or content comprehension.
  • Use loading spinner or progress bar when the question is status display for a running operation rather than the user gesture that starts refresh.
  • Use offline state when connection loss changes what data is available, and show pull-to-refresh failure or disabled refresh as one state inside that offline contract.
  • Use retry when a known refresh request failed and the user is reattempting that same failed request outside the pull gesture.
  • Trigger only when the user pulls downward from the beginning of the intended scroll container; do not fire from the middle of a list or inside the wrong nested scroller.
  • Provide an equivalent manual refresh action in the toolbar, overflow menu, command menu, or visible control.
  • Do not use pull-to-refresh for destructive, reset, submit, payment, account, security, or consent actions.
  • Do not replace pagination, live update controls, or stale-data labeling with a hidden gesture.

Required States

  • Idle state with current content visible and last updated timestamp when freshness matters.
  • Scrolled-not-at-top state where upward scroll does not arm refresh.
  • At-top armed state that can begin measuring downward pull distance.
  • Pulling-under-threshold state with progress feedback and no request started.
  • Threshold reached state with Release to refresh copy.
  • Refreshing state with one in-flight refresh, disabled duplicate activation, and status message.
  • Success state with refreshed content, stable scroll or focus, and updated timestamp.
  • No-new-data state that confirms the refresh completed without changing the list.
  • Failed refresh state that preserves existing content and offers retry or manual refresh.
  • Offline or cached-data state that labels stale content and avoids endless spinning.
  • Nested scroll state where inner content scrolls before the outer refresh container arms.
  • Rate-limited or cooldown state with wait reason and next possible refresh time.
  • Manual refresh equivalent state reachable without the gesture.
  • Mobile compact and large-text states where indicator, controls, and status do not overlap.

Interaction Contract

  • Pull-to-refresh begins only when the intended scroll container is at its top boundary and the user drags downward beyond normal scroll tolerance.
  • The indicator shows progress toward a defined threshold before refresh starts.
  • The refresh request starts on release after threshold, not merely on touch down or incidental overscroll.
  • Releasing before threshold cancels the gesture and leaves data unchanged.
  • Only one refresh runs per data scope at a time; duplicate pulls, manual refresh, and automatic refresh share the same in-flight guard.
  • Existing content stays visible during refresh unless the product has a stronger reason to switch to a separate loading state.
  • The result announces refreshing, refreshed, no new updates, failed, offline, or rate limited through visible text and programmatic status.
  • Nested scroll containers define which scroller owns the gesture before implementation.

Implementation Checklist

  • Name the data scope refreshed by the gesture, such as current inbox filter, current feed, selected workspace, or current dashboard cards.
  • Detect the top of the intended scroll container and exclude middle-of-list, horizontal swipe, row action, text selection, drag handle, and nested-scroll gestures.
  • Set pull distance, threshold, release boundary, cancel behavior, indicator placement, and in-flight duplicate guard.
  • Make the manual refresh control call the same refresh method as the pull gesture.
  • Preserve scroll anchor, selected item, focus target, filters, read state, expanded rows, and cached data across the refresh.
  • Show last updated, refreshing, refreshed, no new updates, failed, offline, retry, and rate-limited states near the affected content.
  • Use status messaging so assistive technology can perceive refresh start and result without moving focus unexpectedly.
  • Test top-of-scroll detection, nested scrollers, slow network, offline mode, rate limits, duplicate pulls, large text, screen reader, keyboard, switch, mouse wheel, touchpad, and mobile landscape.

Common Generated-UI Mistakes

  • Making pull-to-refresh the only way to update the data.
  • Triggering refresh from anywhere in the list instead of only from the top of the intended scroll container.
  • Providing no pull distance, threshold, release-to-refresh, refreshing, success, failure, or last-updated feedback.
  • Clearing existing content during refresh and making the surface feel like a full page reload.
  • Letting nested comment panels, maps, carousels, or row actions fight the refresh gesture.
  • Starting duplicate refresh requests while one is already in progress.
  • Spinning forever while offline or rate limited.
  • Using the gesture for hidden reset, delete, submit, or destructive effects.

Critique Questions

  • Which exact scroll container owns the pull, and how do you know it is at the top?
  • What pull distance and threshold tell users when release will refresh?
  • What visible and announced status proves refreshing started, succeeded, found no new data, failed, or was blocked offline?
  • Where is the equivalent manual refresh path for users who cannot or do not perform the gesture?
  • What happens to scroll position, focus, selected item, filters, and cached content while refresh runs?
  • How do nested scrollers, horizontal row actions, touch gesture shortcuts, and browser or OS gestures avoid conflicts?
  • What prevents duplicate refresh, rate-limit loops, and destructive side effects?
Accessibility
  • Provide a manual refresh command that does not require a path-based gesture.
  • Expose Refresh, Refreshing, Refreshed, No new updates, Offline, Failed, and Rate limited states through text and status messaging.
  • Do not move focus simply because refresh begins; keep focus stable unless the user activated a manual control that has a clear result target.
  • Keep refresh controls reachable by keyboard, switch, screen reader, external keyboard, and assistive pointer devices.
  • Avoid relying on color or motion alone to communicate threshold, in-progress state, or completion.
  • Respect target size and spacing for manual controls and adjacent row actions.
Keyboard Behavior
  • Keyboard users can reach a Refresh action in a toolbar, overflow menu, command area, or near the list header.
  • The manual Refresh action enters the same refreshing, success, no-new-data, failed, offline, and rate-limited states as the gesture.
  • Focus remains on the Refresh control or relevant status while the request is pending, then returns to the refreshed list or status without a surprise jump.
  • Repeated Enter or Space activation is ignored or disabled while a refresh is already running.
  • Escape is not required for normal cancellation, because releasing before threshold cancels the touch gesture; keyboard users receive disabled or pending state instead.
Variants
  • Feed pull to refresh
  • Inbox pull to refresh
  • Dashboard pull to refresh
  • Refresh from toolbar or overflow
  • Pull with last updated timestamp
  • Pull with no new updates result
  • Offline pull refresh
  • Nested scroll pull refresh
  • Rate-limited refresh
  • Large-text pull refresh

Verification

Last verified: