# cleveroad/loopbar architecture

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

- Interactive diagram: https://gitdiagram.com/cleveroad/loopbar
- Repository: https://github.com/cleveroad/loopbar

## Overview

LoopBar is an Android tab-bar library for navigating selectable categories. An app supplies category data through a RecyclerView adapter, a menu, or a ViewPager; LoopBar renders the category list alongside a selected view and handles selection and scrolling. Its core runtime wraps adapters to support infinite, finite, and auto scrolling, while orientation strategies configure horizontal or vertical layouts and selection placement. The README documents overlay and RecyclerView customization as additional capabilities. Some menu and ViewPager wiring is documented but not visible in the sampled source, so those links are omitted.

Main entry points: [`LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/LoopBarView.java`](https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/LoopBarView.java) (LoopBar view), [`LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/ChangeScrollModeAdapter.java`](https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/ChangeScrollModeAdapter.java) (Scroll mode wrapper), [`LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget`](https://github.com/cleveroad/loopbar/tree/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget) (Orientation states), [`LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/CategoriesAdapter.java`](https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/CategoriesAdapter.java) (Category wrapper)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_view["Widget and layout"]
  node_loopbar["LoopBar view<br/>[LoopBarView.java]"]
  node_orient["Orientation states"]
  node_scrolladapter["Scroll mode wrapper"]
  node_categoriesadapter["Category wrapper"]
  node_click["Click listener"]
end

subgraph group_adapter["Category adapters"]
  node_simpleadapter["Simple categories adapter"]
  node_menuadapter["Menu adapter"]
  node_pageradapter["Pager adapter interface"]
  node_categoryinterface["Category item contract<br/>[ICategoryItem.java]"]
end

subgraph group_data["Category data"]
  node_categoryitem["Category item<br/>[CategoryItem.java]"]
  node_operation["Visibility state<br/>[OperationItem.java]"]
end

subgraph group_resources["Visual resources"]
  node_layout["Orientation layouts"]
  node_anim["Selection animations"]
  node_attrs["Widget attributes"]
end

node_app(("Android app"))
node_recycler["App RecyclerView adapter"]

node_app -->|"configures"| node_loopbar
node_app -->|"provides adapter"| node_recycler
node_loopbar -->|"wraps adapter"| node_scrolladapter
node_scrolladapter -->|"creates"| node_categoriesadapter
node_categoriesadapter -->|"binds items"| node_recycler
node_loopbar -->|"selects layout"| node_orient
node_orient -->|"uses layouts"| node_layout
node_loopbar -->|"loads animations"| node_anim
node_loopbar -->|"reads attributes"| node_attrs
node_app -->|"may provide"| node_simpleadapter
node_app -.->|"may provide"| node_menuadapter
node_simpleadapter -->|"binds contract"| node_categoryinterface
node_categoryitem -->|"implements"| node_categoryinterface
node_app -.->|"may implement"| node_pageradapter
node_scrolladapter -->|"tracks visibility"| node_operation
node_app -->|"registers listener"| node_click

click node_loopbar "https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/LoopBarView.java"
click node_orient "https://github.com/cleveroad/loopbar/tree/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget"
click node_scrolladapter "https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/ChangeScrollModeAdapter.java"
click node_categoriesadapter "https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/CategoriesAdapter.java"
click node_click "https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/OnItemClickListener.java"
click node_simpleadapter "https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/adapter/SimpleCategoriesAdapter.java"
click node_menuadapter "https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/adapter/SimpleCategoriesMenuAdapter.java"
click node_pageradapter "https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/adapter/ILoopBarPagerAdapter.java"
click node_categoryitem "https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/model/CategoryItem.java"
click node_categoryinterface "https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/adapter/ICategoryItem.java"
click node_operation "https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/adapter/OperationItem.java"
click node_layout "https://github.com/cleveroad/loopbar/tree/master/LoopBar-widget/src/main/res/layout"
click node_anim "https://github.com/cleveroad/loopbar/tree/master/LoopBar-widget/src/main/res/animator"
click node_attrs "https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/res/values/EndlessNavigationViewAttrs.xml"

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_loopbar,node_orient,node_scrolladapter,node_categoriesadapter,node_click,node_recycler toneBlue
class node_simpleadapter,node_menuadapter,node_pageradapter,node_categoryinterface toneAmber
class node_categoryitem,node_operation toneMint
class node_layout,node_anim,node_attrs toneRose
class node_app toneIndigo
```

## Components

### Widget and layout

- [LoopBar view](https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/LoopBarView.java): `LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/LoopBarView.java`
- [Orientation states](https://github.com/cleveroad/loopbar/tree/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget): `LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget`
- [Scroll mode wrapper](https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/ChangeScrollModeAdapter.java): `LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/ChangeScrollModeAdapter.java`
- [Category wrapper](https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/CategoriesAdapter.java): `LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/CategoriesAdapter.java`
- [Click listener](https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/OnItemClickListener.java): `LoopBar-widget/src/main/java/com/cleveroad/loopbar/widget/OnItemClickListener.java`

### Category adapters

- [Simple categories adapter](https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/adapter/SimpleCategoriesAdapter.java): `LoopBar-widget/src/main/java/com/cleveroad/loopbar/adapter/SimpleCategoriesAdapter.java`
- [Menu adapter](https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/adapter/SimpleCategoriesMenuAdapter.java): `LoopBar-widget/src/main/java/com/cleveroad/loopbar/adapter/SimpleCategoriesMenuAdapter.java`
- [Pager adapter interface](https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/adapter/ILoopBarPagerAdapter.java): `LoopBar-widget/src/main/java/com/cleveroad/loopbar/adapter/ILoopBarPagerAdapter.java`
- [Category item contract](https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/adapter/ICategoryItem.java): `LoopBar-widget/src/main/java/com/cleveroad/loopbar/adapter/ICategoryItem.java`

### Category data

- [Category item](https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/model/CategoryItem.java): `LoopBar-widget/src/main/java/com/cleveroad/loopbar/model/CategoryItem.java`
- [Visibility state](https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/java/com/cleveroad/loopbar/adapter/OperationItem.java): `LoopBar-widget/src/main/java/com/cleveroad/loopbar/adapter/OperationItem.java`

### Visual resources

- [Orientation layouts](https://github.com/cleveroad/loopbar/tree/master/LoopBar-widget/src/main/res/layout): `LoopBar-widget/src/main/res/layout`
- [Selection animations](https://github.com/cleveroad/loopbar/tree/master/LoopBar-widget/src/main/res/animator): `LoopBar-widget/src/main/res/animator`
- [Widget attributes](https://github.com/cleveroad/loopbar/blob/master/LoopBar-widget/src/main/res/values/EndlessNavigationViewAttrs.xml): `LoopBar-widget/src/main/res/values/EndlessNavigationViewAttrs.xml`

### Other components

- **Android app**
- **App RecyclerView adapter**

## Connections

- Android app → LoopBar view: configures
- Android app → App RecyclerView adapter: provides adapter
- LoopBar view → Scroll mode wrapper: wraps adapter
- Scroll mode wrapper → Category wrapper: creates
- Category wrapper → App RecyclerView adapter: binds items
- LoopBar view → Orientation states: selects layout
- Orientation states → Orientation layouts: uses layouts
- LoopBar view → Selection animations: loads animations
- LoopBar view → Widget attributes: reads attributes
- Android app → Simple categories adapter: may provide
- Android app → Menu adapter: may provide
- Simple categories adapter → Category item contract: binds contract
- Category item → Category item contract: implements
- Android app → Pager adapter interface: may implement
- Scroll mode wrapper → Visibility state: tracks visibility
- Android app → Click listener: registers listener
