Open-source project
cymcsg/UltimateRecyclerView avatar
cymcsg/UltimateRecyclerView

UltimateRecyclerView: a RecyclerView with refresh, swipe and infinite scroll

A RecyclerView(advanced and flexible version of ListView in Android) with refreshing,loading more,animation and many other features.

7,165 stars1,411 forksJavaApache-2.0

At a glance

What is it?
UltimateRecyclerView is an Apache-2.0 Java library that wraps RecyclerView with pull to refresh, swipe to dismiss, drag and drop, sticky headers and load-more behaviour. Its tag line is that you use it just like RecyclerView, and the version log shows a long chain of support-library renumbering that would now be hard to reproduce.
Who is it for?
Adopt UltimateRecyclerView when you are shipping an AndroidX app and want pull to refresh, swipe to dismiss and load-more in a single widget instead of assembling three libraries, and when you can live with the fact that the newest tagged release is v0.7.0 from 2016-08-05 while the Gradle coordinates point at 0.9.0.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 5 days ago.
What is it written in?
Mainly Java, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 21, 2026, and from our analysis. They are not legal advice.

Editorial analysis

One widget that swallows the usual RecyclerView accessories

UltimateRecyclerView is a Java library for Android that describes itself as an advanced and flexible version of ListView, built on RecyclerView. The description on the repository makes the pitch in one sentence: pulling to refresh, loading more, swiping to dismiss, dragging and drop, animations, sticky header, showing or hiding the toolbar and the floating action button while scrolling, and more. The README insists that you can use it just like RecyclerView, and it now supports AndroidX after the v0.8.0 migration.

The library lives in the com.marshalchen.ultimaterecyclerview namespace, the licence is Apache-2.0, and the project ships a sample application alongside the library module. That combination of an explicit licence and a bundled demo matters for adoption, because a wrapper library earns trust by letting you see the whole feature set running in one app rather than a list of claims on a page.

The interesting part is what it replaces. A plain RecyclerView gives you recycling, adapters and layout managers. Everything else in a typical list screen, refresh gesture, empty state, load-more trigger, dismiss gesture, is normally assembled by the application team out of separate pieces. UltimateRecyclerView moves that assembly into the widget itself, which is convenient and, as the later sections show, also the source of its main cost.

Gestures the feature list covers: refresh, swipe, drag and infinite scroll

The README enumerates the gesture features, and the list is worth reading closely because each entry maps to a problem that normally costs a dependency. Swipe to refresh is implemented on top of AndroidX SwipeRefreshLayout, so the familiar pull gesture arrives already wired. Swipe to dismiss handles the row-removal pattern that otherwise needs a gesture detector of your own. Drag and drop items covers reordering inside the list, and the version log mentions that v0.5.6 added a node connector feature for linearlayoutmanager, where extending TimeLineView gives you unlimited builds from connected nodes.

Loading more when you reach the last item, which the README calls infinite scrolling, is the other half. Custom views in loading more and a loading adapter with animation let you replace the footer that signals more data. The version log for v0.5.8 is specific about how this behaves: the load more function was fixed so that it no longer triggers early, and the change was made without requiring any change on the implementation side.

Two smaller entries are easy to overlook. Scrollbars are included, and showing or hiding the toolbar and floating button when scrolling is handled by the list, which matters for screens where the floating action button would otherwise cover the last rows.

Header views, sticky headers and rows that expand

Beyond gestures, the library deals with the shape of the list itself. A parallax or normal head view can be attached above the items, a sticky header can behave the way an Instagram-style section header does, and expandable view in recyclerview lets a row open up in place rather than pushing the app to a detail screen. Support different layout in adapter means one adapter can hold more than one row type, and the sample screenshots linked from the README cover a grid layout demo, an expandable row, a node timeline and a multitype list.

That multitype support is the feature that pulls in the rest of the ecosystem. A list with several row types needs flexible dividers, per-type item animations and layout manager behaviour that understands the rows. The README credits those pieces to separate projects: animators from recyclerview-animators, handling of different LayoutManager types from SuperRecyclerView, dividers from RecyclerView-FlexibleDivider and the parallax header from android-parallax-recyclerview. The alternative approach for a team that wants to own those pieces directly is to compose them yourself, and UltimateRecyclerView is essentially that composition packaged as one artifact.

Adding the dependency and swapping in the layout tag

Setup is a Gradle dependency plus one layout tag. The README shows the coordinates below, with mavenCentral() and google() declared in the repositories block.

groovy
repositories {
    mavenCentral()
    google()
}
dependencies {
    ...
    implementation 'com.marshalchen.ultimaterecyclerview:library:0.9.0'
}

If you resolve artifacts through Maven instead, the same artifact is described by this coordinate block:

xml
<dependency>
  <groupId>com.marshalchen.ultimaterecyclerview</groupId>
  <artifactId>library</artifactId>
  <version>0.9.0</version>
</dependency>

In the layout file, the widget replaces the platform RecyclerView and keeps the usual match_parent sizing plus an id:

xml
<com.marshalchen.ultimaterecyclerview.UltimateRecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/ultimate_recycler_view"
/>

Everything beyond that is left to the wiki and the demo app. The README points readers to the wiki for more usage, and the sample is hosted as a release APK on GitHub because of what the project calls rapid updates and developments, with a copy on Google Play under the demo package name.

A version log that reads like a support-library ledger

The version history is the most revealing part of the README, because it documents a long chain of support-library bumps rather than a sequence of new capabilities. v0.5.0 moved the library onto support library 23.2.1 and pointed users who needed 23.1.1 back to the previous release. v0.4.9 is described as the last version based on 23.1.1 and states that the library will not be supported on that version. v0.5.6 moved to 23.3.0, and v0.5.8 to 23.4.0. v0.8.0 was the migration to AndroidX, and v0.7.0 added support for most features in RecyclerView 24.0.0, improved the UltimateAdapter and reduced the size of the library.

Two dates frame the current state. The newest tagged release listed is v0.7.0 from 2016-08-05, with 0.5.92 from 2016-06-14 described as a release of the sample app and 0.4.9 from 2016-04-05 noted as the last version supporting v23.1.1. The last push to the repository, by contrast, was on 2026-10-18. A repository that is still being pushed while its newest tag dates from 2016 tells you the master branch moved past the tagged releases, and it means the version in your build is whatever artifact the remote repository happens to serve.

Where a bundled feature set becomes a liability

The obvious trade-off is that a widget which does everything also carries every decision. Swipe to dismiss, drag and drop, load-more triggers and head views all interact, and the README itself lists open discussions for headers, for loading more and for swipe issues, plus an UpcomingChanges.md wishlist for an earlier version. The README also states plainly that the project is under development and that the listed demo might not be the latest version.

There is a second limit with a different character. UltimateRecyclerView is an application-level UI library, so it competes for the same screen real estate as the platform RecyclerView and the official AndroidX SwipeRefreshLayout. When a platform component already covers the behaviour you need, wrapping it means you own the wrapper. If your list screen needs refresh and nothing else, the AndroidX solution is smaller and you avoid a dependency whose release tags stopped in 2016.

For a team that wants refresh, dismissal and load-more in one place, the trade runs the other way: composing those from separate libraries is more code and more version alignment, which is precisely the argument for taking the whole widget.

Editorial conclusion

Adopt UltimateRecyclerView when you are shipping an AndroidX app and want pull to refresh, swipe to dismiss and load-more in a single widget instead of assembling three libraries, and when you can live with the fact that the newest tagged release is v0.7.0 from 2016-08-05 while the Gradle coordinates point at 0.9.0. Skip it if your team wants a maintained dependency with regular releases, because the version log reads as a support-library compatibility ledger rather than a feature roadmap. Verify first that the artifact you pull resolves for your AndroidX and compileSdk levels, and that the UltimateRecyclerView tag in your layout inflates cleanly in your own activity.

Frequently asked questions

What licence is UltimateRecyclerView released under?

The repository lists Apache-2.0, with a LICENSE file at the top level of the project and an Apache 2 badge in the README.

How do I add UltimateRecyclerView to an Android project?

Add the dependency com.marshalchen.ultimaterecyclerview:library:0.9.0 to your Gradle build, then use the com.marshalchen.ultimaterecyclerview.UltimateRecyclerView tag in your layout XML instead of the platform RecyclerView.

Does UltimateRecyclerView support AndroidX?

Yes. The README states that the project supports AndroidX now, and the version log records v0.8.0 as the migration to AndroidX.

Which features does UltimateRecyclerView handle out of the box?

The README lists swipe to refresh using AndroidX SwipeRefreshLayout, swipe to dismiss, drag and drop, load more when reaching the last item, custom loading views, parallax or normal head views, sticky headers, expandable rows, scrollbars, animations and toolbar or floating button hiding on scroll.

Official sources

  1. cymcsg/UltimateRecyclerView on GitHub
  2. Issues
  3. License: Apache-2.0
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/cymcsg-ultimaterecyclerview.svg)](https://hysenlabs.com/projects/cymcsg-ultimaterecyclerview)

Was this useful?