# scwang90/smartrefreshlayout architecture

> Architecture diagram of the GitHub repository scwang90/smartrefreshlayout, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-09). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/scwang90/smartrefreshlayout
- Repository: https://github.com/scwang90/smartrefreshlayout

## Overview

SmartRefreshLayout is an Android pull-to-refresh and load-more framework, accompanied here by a demo app. The principal workflow is a user gesture or automatic trigger handled by the refresh layout, which coordinates scrollable content, header/footer components, state transitions, and refresh/load callbacks; the app supplies the data operation and finishes the interaction. The README also documents nested scrolling, two-level refresh, horizontal refresh, and multiple component styles. Core coordination and several component interfaces are sampled; links for unsampled feature implementations are omitted or marked unverified.

Main entry points: [`refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/SmartRefreshLayout.java`](https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/SmartRefreshLayout.java) (Refresh layout), [`app/src/main/java/com/scwang/refresh/layout/App.java`](https://github.com/scwang90/smartrefreshlayout/blob/main/app/src/main/java/com/scwang/refresh/layout/App.java) (Demo startup), [`app/src/main/java/com/scwang/refresh/layout/activity/practice`](https://github.com/scwang90/smartrefreshlayout/tree/main/app/src/main/java/com/scwang/refresh/layout/activity/practice) (Practice screens), [`app/src/main/java/com/scwang/refresh/layout/activity/style`](https://github.com/scwang90/smartrefreshlayout/tree/main/app/src/main/java/com/scwang/refresh/layout/activity/style) (Style screens)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_kernel["Refresh kernel"]
  node_layout["Refresh layout"]
  node_contracts["Component contracts"]
  node_state["Refresh states<br/>[RefreshState.java]"]
  node_scroll["Scroll detection<br/>[SmartUtil.java]"]
  node_content["Content wrappers"]
  node_horizontal["Horizontal refresh"]
end

subgraph group_components["Refresh components"]
  node_headers["Header styles"]
  node_classic_header["Classics header"]
  node_special_headers["Packaged headers"]
  node_footer["Footer styles"]
  node_classic_footer["Classics footer"]
  node_ball_footer["Ball footer"]
end

subgraph group_demo["Demo app"]
  node_demo_app["Demo startup<br/>[App.java]"]
  node_demo_index["Demo navigation"]
  node_demo_practice["Practice screens"]
  node_demo_styles["Style screens"]
  node_demo_fragments["Demo sections"]
  node_demo_adapter["List adapter"]
end

subgraph group_support["Utilities and visuals"]
  node_paint["Paint drawables<br/>[PaintDrawable.java]"]
  node_path_drawable["Path drawables<br/>[PathsDrawable.java]"]
  node_status["Status bar helper<br/>[StatusBarUtil.java]"]
end

node_developer(("App developer"))
node_user(("App user"))

node_developer -->|"configures"| node_layout
node_user -.->|"pulls or loads"| node_layout
node_layout -->|"uses contracts"| node_contracts
node_layout -->|"tracks state"| node_state
node_layout -->|"checks scrolling"| node_scroll
node_layout -->|"wraps content"| node_content
node_layout -.->|"hosts header"| node_headers
node_layout -.->|"hosts footer"| node_footer
node_layout -->|"supports horizontal"| node_horizontal
node_developer -->|"runs demo"| node_demo_app
node_demo_app -->|"sets defaults"| node_layout
node_demo_app -->|"registers default"| node_classic_header
node_demo_app -->|"registers default"| node_classic_footer
node_demo_index -.->|"shows sections"| node_demo_fragments
node_demo_fragments -->|"opens styles"| node_demo_styles
node_demo_fragments -.->|"opens examples"| node_demo_practice
node_demo_practice -->|"configures refresh"| node_layout
node_demo_practice -->|"uses adapter"| node_demo_adapter
node_demo_styles -.->|"demonstrates styles"| node_headers
node_demo_styles -.->|"demonstrates classic"| node_classic_header
node_demo_practice -->|"adjusts system bars"| node_status

click node_layout "https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/SmartRefreshLayout.java"
click node_contracts "https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/api/RefreshComponent.java"
click node_state "https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/constant/RefreshState.java"
click node_scroll "https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/util/SmartUtil.java"
click node_content "https://github.com/scwang90/smartrefreshlayout/tree/main/refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/wrapper"
click node_horizontal "https://github.com/scwang90/smartrefreshlayout/blob/main/app/src/main/java/com/scwang/refresh/layout/widget/SmartRefreshHorizontal.java"
click node_headers "https://github.com/scwang90/smartrefreshlayout/tree/main/refresh-header/src/main/java/com/scwang/smart/refresh/header"
click node_classic_header "https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-header-classics/src/main/java/com/scwang/smart/refresh/header/ClassicsHeader.java"
click node_special_headers "https://github.com/scwang90/smartrefreshlayout/tree/main/refresh-header-material/src/main/java/com/scwang/smart/refresh/header"
click node_classic_footer "https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-footer-classics/src/main/java/com/scwang/smart/refresh/footer/ClassicsFooter.java"
click node_ball_footer "https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-footer-ball/src/main/java/com/scwang/smart/refresh/footer/BallPulseFooter.java"
click node_demo_app "https://github.com/scwang90/smartrefreshlayout/blob/main/app/src/main/java/com/scwang/refresh/layout/App.java"
click node_demo_index "https://github.com/scwang90/smartrefreshlayout/blob/main/app/src/main/java/com/scwang/refresh/layout/activity/IndexMainActivity.java"
click node_demo_practice "https://github.com/scwang90/smartrefreshlayout/tree/main/app/src/main/java/com/scwang/refresh/layout/activity/practice"
click node_demo_styles "https://github.com/scwang90/smartrefreshlayout/tree/main/app/src/main/java/com/scwang/refresh/layout/activity/style"
click node_demo_fragments "https://github.com/scwang90/smartrefreshlayout/tree/main/app/src/main/java/com/scwang/refresh/layout/fragment/index"
click node_demo_adapter "https://github.com/scwang90/smartrefreshlayout/blob/main/app/src/main/java/com/scwang/refresh/layout/adapter/BaseRecyclerAdapter.java"
click node_paint "https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-drawable-paint/src/main/java/com/scwang/smart/drawable/PaintDrawable.java"
click node_path_drawable "https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-drawable-path/src/main/java/com/scwang/smart/drawable/PathsDrawable.java"
click node_status "https://github.com/scwang90/smartrefreshlayout/blob/main/app/src/main/java/com/scwang/refresh/layout/util/StatusBarUtil.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_layout,node_contracts,node_state,node_scroll,node_content,node_horizontal,node_user toneBlue
class node_headers,node_classic_header,node_special_headers,node_footer,node_classic_footer,node_ball_footer toneAmber
class node_demo_app,node_demo_index,node_demo_practice,node_demo_styles,node_demo_fragments,node_demo_adapter toneMint
class node_paint,node_path_drawable,node_status toneRose
class node_developer toneIndigo
```

## Components

### Refresh kernel

- [Refresh layout](https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/SmartRefreshLayout.java): `refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/SmartRefreshLayout.java`
- [Component contracts](https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/api/RefreshComponent.java): `refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/api/RefreshComponent.java`
- [Refresh states](https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/constant/RefreshState.java): `refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/constant/RefreshState.java`
- [Scroll detection](https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/util/SmartUtil.java): `refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/util/SmartUtil.java`
- [Content wrappers](https://github.com/scwang90/smartrefreshlayout/tree/main/refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/wrapper): `refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/wrapper`
- [Horizontal refresh](https://github.com/scwang90/smartrefreshlayout/blob/main/app/src/main/java/com/scwang/refresh/layout/widget/SmartRefreshHorizontal.java): `app/src/main/java/com/scwang/refresh/layout/widget/SmartRefreshHorizontal.java`

### Refresh components

- [Header styles](https://github.com/scwang90/smartrefreshlayout/tree/main/refresh-header/src/main/java/com/scwang/smart/refresh/header): `refresh-header/src/main/java/com/scwang/smart/refresh/header`
- [Classics header](https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-header-classics/src/main/java/com/scwang/smart/refresh/header/ClassicsHeader.java): `refresh-header-classics/src/main/java/com/scwang/smart/refresh/header/ClassicsHeader.java`
- [Packaged headers](https://github.com/scwang90/smartrefreshlayout/tree/main/refresh-header-material/src/main/java/com/scwang/smart/refresh/header): `refresh-header-material/src/main/java/com/scwang/smart/refresh/header`
- **Footer styles**
- [Classics footer](https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-footer-classics/src/main/java/com/scwang/smart/refresh/footer/ClassicsFooter.java): `refresh-footer-classics/src/main/java/com/scwang/smart/refresh/footer/ClassicsFooter.java`
- [Ball footer](https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-footer-ball/src/main/java/com/scwang/smart/refresh/footer/BallPulseFooter.java): `refresh-footer-ball/src/main/java/com/scwang/smart/refresh/footer/BallPulseFooter.java`

### Demo app

- [Demo startup](https://github.com/scwang90/smartrefreshlayout/blob/main/app/src/main/java/com/scwang/refresh/layout/App.java): `app/src/main/java/com/scwang/refresh/layout/App.java`
- [Demo navigation](https://github.com/scwang90/smartrefreshlayout/blob/main/app/src/main/java/com/scwang/refresh/layout/activity/IndexMainActivity.java): `app/src/main/java/com/scwang/refresh/layout/activity/IndexMainActivity.java`
- [Practice screens](https://github.com/scwang90/smartrefreshlayout/tree/main/app/src/main/java/com/scwang/refresh/layout/activity/practice): `app/src/main/java/com/scwang/refresh/layout/activity/practice`
- [Style screens](https://github.com/scwang90/smartrefreshlayout/tree/main/app/src/main/java/com/scwang/refresh/layout/activity/style): `app/src/main/java/com/scwang/refresh/layout/activity/style`
- [Demo sections](https://github.com/scwang90/smartrefreshlayout/tree/main/app/src/main/java/com/scwang/refresh/layout/fragment/index): `app/src/main/java/com/scwang/refresh/layout/fragment/index`
- [List adapter](https://github.com/scwang90/smartrefreshlayout/blob/main/app/src/main/java/com/scwang/refresh/layout/adapter/BaseRecyclerAdapter.java): `app/src/main/java/com/scwang/refresh/layout/adapter/BaseRecyclerAdapter.java`

### Utilities and visuals

- [Paint drawables](https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-drawable-paint/src/main/java/com/scwang/smart/drawable/PaintDrawable.java): `refresh-drawable-paint/src/main/java/com/scwang/smart/drawable/PaintDrawable.java`
- [Path drawables](https://github.com/scwang90/smartrefreshlayout/blob/main/refresh-drawable-path/src/main/java/com/scwang/smart/drawable/PathsDrawable.java): `refresh-drawable-path/src/main/java/com/scwang/smart/drawable/PathsDrawable.java`
- [Status bar helper](https://github.com/scwang90/smartrefreshlayout/blob/main/app/src/main/java/com/scwang/refresh/layout/util/StatusBarUtil.java): `app/src/main/java/com/scwang/refresh/layout/util/StatusBarUtil.java`

### Other components

- **App developer**
- **App user**

## Connections

- App developer → Refresh layout: configures
- App user → Refresh layout: pulls or loads
- Refresh layout → Component contracts: uses contracts (evidence: `refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/SmartRefreshLayout.java`)
- Refresh layout → Refresh states: tracks state (evidence: `refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/SmartRefreshLayout.java`)
- Refresh layout → Scroll detection: checks scrolling (evidence: `refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/SmartRefreshLayout.java`)
- Refresh layout → Content wrappers: wraps content (evidence: `refresh-layout-kernel/src/main/java/com/scwang/smart/refresh/layout/SmartRefreshLayout.java`)
- Refresh layout → Header styles: hosts header
- Refresh layout → Footer styles: hosts footer
- Refresh layout → Horizontal refresh: supports horizontal
- App developer → Demo startup: runs demo
- Demo startup → Refresh layout: sets defaults (evidence: `app/src/main/java/com/scwang/refresh/layout/App.java`)
- Demo startup → Classics header: registers default (evidence: `app/src/main/java/com/scwang/refresh/layout/App.java`)
- Demo startup → Classics footer: registers default (evidence: `app/src/main/java/com/scwang/refresh/layout/App.java`)
- Demo navigation → Demo sections: shows sections
- Demo sections → Style screens: opens styles (evidence: `app/src/main/java/com/scwang/refresh/layout/fragment/index/RefreshStylesFragment.java`)
- Demo sections → Practice screens: opens examples
- Practice screens → Refresh layout: configures refresh (evidence: `app/src/main/java/com/scwang/refresh/layout/activity/practice/BannerPracticeActivity.java`)
- Practice screens → List adapter: uses adapter
- Style screens → Header styles: demonstrates styles (evidence: `app/src/main/java/com/scwang/refresh/layout/activity/style/FlyRefreshStyleActivity.java`)
- Style screens → Classics header: demonstrates classic
- Practice screens → Status bar helper: adjusts system bars (evidence: `app/src/main/java/com/scwang/refresh/layout/activity/practice/BannerPracticeActivity.java`)
