nhaarman/ListViewAnimations
[DEPRECATED] An Android library which allows developers to easily add animations to ListView items
Stale — last commit 10y ago
weakest axislast commit was 10y ago; top contributor handles 92% of recent commits…
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓4 active contributors
- ✓Apache-2.0 licensed
- ✓CI configured
Show all 7 evidence items →Show less
- ⚠Stale — last commit 10y ago
- ⚠Small team — 4 contributors active in recent commits
- ⚠Single-maintainer risk — top contributor 92% of recent commits
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Mixed → Healthy if: 1 commit in the last 365 days; diversify commit ownership (top <90%)
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Forkable" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/nhaarman/listviewanimations)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/nhaarman/listviewanimations on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: nhaarman/ListViewAnimations
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/nhaarman/ListViewAnimations shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Stale — last commit 10y ago
- 4 active contributors
- Apache-2.0 licensed
- CI configured
- ⚠ Stale — last commit 10y ago
- ⚠ Small team — 4 contributors active in recent commits
- ⚠ Single-maintainer risk — top contributor 92% of recent commits
- ⚠ No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live nhaarman/ListViewAnimations
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/nhaarman/ListViewAnimations.
What it runs against: a local clone of nhaarman/ListViewAnimations — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in nhaarman/ListViewAnimations | Confirms the artifact applies here, not a fork |
| 2 | License is still Apache-2.0 | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | Last commit ≤ 3503 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of nhaarman/ListViewAnimations. If you don't
# have one yet, run these first:
#
# git clone https://github.com/nhaarman/ListViewAnimations.git
# cd ListViewAnimations
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of nhaarman/ListViewAnimations and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "nhaarman/ListViewAnimations(\\.git)?\\b" \\
&& ok "origin remote is nhaarman/ListViewAnimations" \\
|| miss "origin remote is not nhaarman/ListViewAnimations (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
&& ok "license is Apache-2.0" \\
|| miss "license drift — was Apache-2.0 at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 3503 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~3473d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/nhaarman/ListViewAnimations"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
ListViewAnimations is a deprecated Android library (v3.1.0) that provided pre-built animations for ListView and GridView items, including appearance animations (Alpha, SwingRightIn, ScaleIn), swipe-to-dismiss, drag-and-drop reordering, and item expansion. It abstracted the complexity of animating AbsListView children through modular components (lib-core, lib-manipulation, lib-core-slh) built on NineOldAndroids for backward compatibility. Multi-module Gradle project with three independent libraries: lib-core (appearance animations), lib-manipulation (swipe/drag logic), lib-core-slh (StickyListHeaders support). Example app in example/ demonstrates all features. Build system uses Gradle 0.12.2 with Maven Central publishing; parent build.gradle orchestrates version/group across modules.
👥Who it's for
Android developers targeting ListView/GridView-based UIs (primarily pre-2015) who needed polished item animations without writing custom AnimationSet code. The repo is now a reference implementation for developers migrating legacy ListView code or studying animation patterns, as Google deprecated ListView in favor of RecyclerView.
🌱Maturity & risk
Mature but archived: the project explicitly states deprecation in favor of RecyclerView solutions, indicating end-of-life status. The codebase is stable (v3.1.0), uses CI/CD (.travis.yml), and has modular structure, but no active development is occurring. This is production-ready for legacy apps but not recommended for new projects.
High risk for new projects: the library targets outdated Android ListView APIs that Google deprecated in 2014-2015. Dependency on NineOldAndroids (pre-API 11 compatibility shim) is no longer necessary. Single maintainer (nhaarman), archived state, and zero compatibility with modern RecyclerView means investing in this for new code is a technical debt trap.
Active areas of work
Nothing—the repository is in maintenance-only mode. The README explicitly states 'No new development will be taking place.' The .travis.yml suggests CI was active, but with the deprecation notice and no visible recent commits in the file structure, this project is essentially frozen at v3.1.0.
🚀Get running
git clone https://github.com/nhaarman/ListViewAnimations.git && cd ListViewAnimations && ./gradlew build && ./gradlew assembleDebug -p example/ (Gradle wrapper is standard for this era). Inspect example/src/main/java/com/haarman/listviewanimations/ for runnable Activity examples.
Daily commands: This is a library, not an executable app. To see it in action: ./gradlew :example:assembleDebug && adb install -r example/build/outputs/apk/example-debug.apk && adb shell am start -n com.haarman.listviewanimations/.MainActivity. Or open in Android Studio (pre-2020 era project structure) and run via IDE.
🗺️Map of the codebase
- build.gradle: Root Gradle config defining version (3.1.0), group ID, Maven Central publishing, and AGP 0.12.2—controls entire build system
- example/src/main/java/com/haarman/listviewanimations/MainActivity.java: Entry point for the example app; demonstrates API usage for all library features (appearance animations, item manipulation)
- example/src/main/java/com/haarman/listviewanimations/appearance/AppearanceExamplesActivity.java: Shows how to apply built-in animations (Alpha, SwingRightIn, ScaleIn) to ListViews; critical for understanding lib-core usage
- example/src/main/java/com/haarman/listviewanimations/itemmanipulation/DynamicListViewActivity.java: Demonstrates swipe-to-dismiss and drag-and-drop reordering from lib-manipulation; shows item manipulation API surface
- example/src/main/java/com/haarman/listviewanimations/MyListAdapter.java: Example ArrayAdapter subclass showing how to integrate animations into custom adapters; reference pattern for client code
- README.md: Explicitly marks project as DEPRECATED in favor of RecyclerView; critical context for new developers
- .travis.yml: CI configuration showing historical build pipeline; indicates project maturity but likely inactive
🛠️How to make changes
To add a new appearance animation: create a class extending com.haarman.listviewanimations.itemmanipulation.AnimationAdapter in lib-core, implement AnimationProvider, add to example/src/main/java/com/haarman/listviewanimations/appearance/AppearanceExamplesActivity.java. For swipe-to-dismiss: extend lib-manipulation's SwipeHelper in example/src/main/java/com/haarman/listviewanimations/itemmanipulation/DynamicListViewActivity.java. Core adapter logic lives in lib-core and lib-manipulation/src/main/java/com/haarman/listviewanimations/.
🪤Traps & gotchas
Critical: This library is deprecated and incompatible with modern Android (RecyclerView, AndroidX). NineOldAndroids dependency is bundled but obsolete. The Gradle wrapper version (0.12.2 from 2014) will fail on Java 11+ without workarounds; modern Android Studio may refuse to open this project. Example app uses old android-maven-plugin and IInAppBillingService.aidl (in-app purchases) which adds unused complexity. No version constraints visible in build.gradle snippets—dependency resolution may fail on newer Gradle versions. Project uses absolute group/version inheritance from root—modifying lib-core requires rebuilding all three modules.
💡Concepts to learn
- NineOldAndroids Backport — This library relies entirely on NineOldAndroids to provide android.animation.ObjectAnimator for devices below API 11; understanding this compatibility shim is crucial for troubleshooting animation issues on old Android versions
- AbsListView Adapter Wrapping — ListViewAnimations uses the decorator pattern, wrapping ArrayAdapter instances to inject animation logic without modifying client code; recognizing this pattern is key to extending the library
- ListView Item Recycling & ViewHolder — The library must coordinate animations with ListView's view recycling; animations must reset properly when views are reused, a subtle complexity not obvious in the API surface
- Interpolators & Easing Functions — Built-in animations (SwingRightIn, ScaleIn) use custom Interpolator implementations to achieve smooth motion; understanding cubic bezier curves and Interpolator#getInterpolation() is needed to create new animations
- Gesture Detection & Swipe-to-Dismiss — lib-manipulation uses GestureDetector and OnTouchListener to detect swipe gestures and trigger dismiss animations; this is non-trivial coordinate math and event handling specific to ListView
- Android Gradle Plugin Evolution — This project uses AGP 0.12.2 (2014); understanding how Gradle dependency resolution and AAR packaging worked pre-1.0 is necessary to maintain or modernize the build
- Layout Animation Controllers — The library leverages android.view.animation.LayoutAnimationController to sequence animations across multiple ListView items; this is a low-level but powerful API rarely used in modern Android
🔗Related repos
android/arch-components— Google's modern replacement for custom animation patterns; RecyclerView with ItemAnimator is the endorsed successor to ListViewAnimationsklinker41/android-slidinguppanel— Contemporary sliding animation library for Android (same era); uses similar NineOldAndroids pattern for pre-API 11 compatibilityairbnb/epoxy— Modern Airbnb library for RecyclerView-based list building; represents the post-ListView evolution with animation support built-innhaarman/ListViewAnimations-compat— If it exists as a separate repo, would be the spiritual successor adding RecyclerView support; check nhaarman's GitHub for modernization effortsnineoldandroids/NineOldAndroids— The core dependency providing animation backport to pre-API 11; understanding its Animation and ObjectAnimator wrappers is essential to this library
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Migrate example app from deprecated ListView to RecyclerView with animation examples
The repo is marked DEPRECATED with a note directing users to RecyclerView solutions, yet the example app still demonstrates ListView animations. Creating modern RecyclerView equivalents in the example app would provide a migration path for existing users and showcase how to achieve similar animations with current Android APIs. This would be high-value since it bridges the deprecated library to modern practices.
- [ ] Create new RecyclerView-based example activities mirroring existing ones (e.g., RecyclerViewAppearanceExamplesActivity alongside AppearanceExamplesActivity.java)
- [ ] Implement appearance animations using RecyclerView.ItemAnimator for the built-in animations (Alpha, SwingRightIn, SwingLeftIn, etc.)
- [ ] Add Swipe-to-Dismiss and Drag-and-Drop examples using modern ItemTouchHelper instead of ListView-specific implementations
- [ ] Update MainActivity.java to provide navigation between ListView and RecyclerView examples
- [ ] Update README.md with migration guide and links to the new RecyclerView examples
Add unit tests for core animation classes in the library modules
The file structure shows example code but no visible test directory in the partial listing. Core animation logic (appearance animations, swipe-to-dismiss, drag-and-drop) lacks test coverage. Adding unit tests would improve code reliability and serve as documentation for how to use the library's animation APIs.
- [ ] Create test directory structure: library/src/test/java/com/haarman/listviewanimations/
- [ ] Add unit tests for appearance animation classes (Alpha, SwingRightIn, SwingLeftIn, SwingBottomIn, ScaleIn animations)
- [ ] Add unit tests for SwipeToDissmiss animation logic and state management
- [ ] Add unit tests for Drag-and-Drop reordering operations and position validation
- [ ] Ensure tests use AndroidJUnit4 or Robolectric where needed for ListView/GridView interactions
Create comprehensive Javadoc and usage examples for public API classes
While the README mentions features (Appearance animations, Swipe-to-Dismiss, Drag-and-Drop, Animate addition), there's no visible API documentation file. The README appears truncated ('Animate addition o'). Adding complete Javadoc to core animation classes and creating an API reference document would help users understand which classes to extend/use and reduce barrier to adoption.
- [ ] Add detailed Javadoc comments to all public classes in core animation modules (AbsListViewAnimator, AppearanceAnimationAdapter, SwipeToDissmissAdapter, DragAndDropAdapter)
- [ ] Document each animation class with usage examples (Alpha, SwingRightIn, SwingLeftIn, SwingBottomIn, SwingRightIn, ScaleIn)
- [ ] Create API_REFERENCE.md documenting public interfaces, required implementations, and common extension points
- [ ] Add code examples showing how to create custom animations by extending animation base classes
- [ ] Cross-reference examples in example/ directory with API docs
🌿Good first issues
- Add unit tests for appearance animations: lib-core lacks JUnit tests covering Alpha, SwingRightIn, and ScaleIn. Create tests in a new lib-core/src/test/java/ directory verifying animation duration, alpha values, and interpolators match expected behavior.
- Document migration guide from ListView to RecyclerView: README acknowledges deprecation but provides no concrete steps. Add MIGRATION.md with side-by-side code examples (old ListView + ListViewAnimations vs. new RecyclerView + AnimatorSet), mapping each lib-core animation to RecyclerView ItemAnimator equivalents.
- Fix deprecated StickyListHeaders support: lib-core-slh extends lib-core for StickyListHeaders compatibility, but StickyListHeaders itself is abandoned. Identify and document which StickyListHeaders versions are compatible; add @Deprecated annotations to lib-core-slh classes in src/main/java/ with migration hints to modern alternatives (e.g., Epoxy, Flutter sliver).
⭐Top contributors
Click to expand
Top contributors
- @nhaarman — 92 commits
- @WonderCsabo — 4 commits
- @BraisGabin — 3 commits
- @leruaa — 1 commits
📝Recent commits
Click to expand
Recent commits
2361796— Deprecation notice (nhaarman)25124c5— Update CONTRIBUTING.md (nhaarman)4aa6dd2— Merge branch 'master' into dev (nhaarman)066a786— Merge branch 'master' into dev (nhaarman)7e28252— Prepare version 3.1.0 (nhaarman)2dfe85f— Updated README with workaround for #236 (nhaarman)9e54ca2— Merge branch 'dev' of github.com:nhaarman/ListViewAnimations into dev (nhaarman)e7bef03— Proper module (nhaarman)bc53c62— Merge pull request #235 from nhaarman/bugfix_234 (nhaarman)751c3a4— Merge pull request #241 from nhaarman/bugfix-228 (nhaarman)
🔒Security observations
This deprecated Android library has significant security concerns due to its age and lack of maintenance. The primary issues include outdated build tools (Gradle 0.12.2 from 2014), no active security updates, missing dependency verification mechanisms, and lack of modern Android security practices. The library is officially deprecated and should not be used in new projects. For existing projects using this library, immediate migration to RecyclerView-based solutions is strongly recommended. The codebase shows patterns consistent with pre-2015 Android development practices and lacks modern security hardening measures.
- High · Outdated Gradle Build Tool —
build.gradle. The build.gradle file uses Gradle Android plugin version 0.12.2, which is extremely outdated (released around 2014). This version contains numerous known security vulnerabilities and does not support modern security features, dependency verification, or security patches. Fix: Update to the latest stable version of the Android Gradle plugin (currently 8.x). Review and update all build tool versions to their latest stable releases. - High · Deprecated Android Library —
README.md, overall project. The entire ListViewAnimations library is officially deprecated in favor of RecyclerView solutions. Using deprecated libraries means no security updates, bug fixes, or maintenance. The library targets very old Android APIs based on the build configuration. Fix: Migrate to modern Android development patterns using RecyclerView. If already in use, plan for migration and do not use in new projects. - Medium · Missing Gradle Dependency Lock —
build.gradle. The build.gradle file does not use dependency locking or version pinning strategies. This allows transitive dependencies to be resolved to potentially vulnerable versions without explicit control. Fix: Implement Gradle dependency locking using 'dependencyLocking' to ensure reproducible builds and prevent unexpected vulnerable dependency updates. - Medium · Use of Maven Central Without Verification —
build.gradle. The build file fetches dependencies from mavenCentral() without any verification mechanisms (like dependency signatures or checksums validation). This could expose the build to supply chain attacks. Fix: Enable and enforce artifact signature verification. Consider using Gradle's dependency verification feature to validate artifact checksums. - Medium · In-App Billing AIDL Inclusion —
example/src/main/aidl/com/android/vending/billing/IInAppBillingService.aidl. The project includes Google Play In-App Billing AIDL files (IInAppBillingService.aidl) in the example app. If billing functionality is implemented, there could be risks around improper handling of billing responses or security validation. Fix: If in-app billing is used, ensure proper signature verification of billing responses, use server-side validation for all transactions, and follow Google's In-App Billing security best practices. - Low · Missing ProGuard/R8 Configuration Details —
example/proguard-project.txt. While proguard-project.txt exists, there's no visibility into its contents. Improper ProGuard configuration could expose sensitive code or method names. Fix: Review and ensure ProGuard rules are configured to obfuscate sensitive code paths and prevent reverse engineering. Use R8 instead of ProGuard for modern Android projects. - Low · Deprecated Build Tools (Maven) —
example/pom.xml. The example project includes pom.xml (Maven), indicating potential build system mixing. Maven configuration for Android development is outdated and no longer recommended. Fix: Consolidate on Gradle as the single build system. Remove Maven configuration files if no longer in use.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.