☰
UltimateRecyclerView 实战指南:集刷新、加载更多、拖拽与吸附头于一体的 Android RecyclerView 增强方案
2026/9/29 9:20:30 网站建设 项目流程
  • 移动开发
  • UI组件

【免费下载链接】UltimateRecyclerView

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

项目地址:https://gitcode.com/gh_mirrors/ul/UltimateRecyclerView
点击查看免费下载

UltimateRecyclerView 是一个构建于 RecyclerView 之上、支持 AndroidX 的功能增强组件,在保持 "just like RecyclerView" 使用体验的同时,原生集成了下拉刷新、上滑加载更多、滑动删除、拖拽排序、多种入场动画、Instagram 式吸附头部、滚动时自动隐藏 Toolbar 与悬浮按钮等能力。本文将以仓库 README.md 为主线,结合模块源码逐一讲解快速接入、核心 API、适配器体系与各功能模块的实战用法,读完即可在真实项目中完成集成与二次开发。

项目定位:一个"高级且灵活"的 ListView 替代品

按照 README.md 的定位,UltimateRecyclerView 是 RecyclerView 的"advanced and flexible version",即一个使用方式与 RecyclerView 几乎一致、但内置大量常用交互能力的列表容器。项目处于持续开发状态(README 明确标注 "UltimateRecyclerView is a project under development"),并已完整迁移到 AndroidX(v0.8.0 起)。

从源码结构看,核心类 UltimateRecyclerView.java 继承自FrameLayout并实现Scrollable接口,内部组合了RecyclerView、VerticalSwipeRefreshLayout(下拉刷新容器)、默认悬浮按钮、空视图 ViewStub 与浮动按钮 ViewStub,其布局骨架定义在 ultimate_recycler_view_layout.xml 中。也就是说,开发者只需在 XML 中引入一个UltimateRecyclerView,所有增强能力都围绕它展开。

功能特性全景

README 列出的核心特性共 15 项,这些能力几乎都能在 UltimateRecyclerView.java 与配套模块中找到对应实现:

特性说明对应实现/模块
下拉刷新基于 AndroidX SwipeRefreshLayoutsetDefaultOnRefreshListener()、VerticalSwipeRefreshLayout
多种动画适配器加载动画与 Item 增删动画UltimateViewAdapter.getAdapterAnimations()、setItemAnimator()
滑动删除(Swipe to dismiss)侧滑删除列表项SwipeDismissTouchListener、SwipeableUltimateRecyclerview
视差/普通头部可设置视差滚动头部或普通头部setParallaxHeader()/setNormalHeader()
拖拽排序长按拖拽调整顺序DragDropTouchListener、dragsortadapter包
加载更多滑到底部自动加载(无限滚动)setOnLoadMoreListener()、scroll_load_more_detection()
自定义加载更多视图底部进度条可完全自定义setLoadMoreView()、bottom_progressbar.xml
滚动联动 Toolbar/FAB下滑隐藏、上滑显示setScrollViewCallbacks()、ObservableScrollState
滚动条支持纵向/横向滚动条样式recyclerviewScrollbars属性
彩色刷新样式自定义 SwipeRefresh 配色setDefaultSwipeToRefreshColorScheme()、recyclerviewDefaultSwipeColor
吸附头部类似 Instagram 的分组吸附标题stickyheadersrecyclerview包、generateHeaderId()
多布局适配器同一列表内支持不同 item 布局VIEW_TYPES多视图类型体系
带动画的加载适配器适配器加载时逐项动画getAdapterAnimations()的 5 种动画
可展开列表RecyclerView 内支持可展开的父/子项expanx包、LinearExpanxURVAdapter

快速接入:Gradle 与 Maven 依赖

README 给出了最直接的接入方式。使用 Gradle 时,在项目级build.gradle中声明仓库:

repositories { mavenCentral() google() }

然后在模块依赖中添加(版本以 README.md 当前给出的 0.9.0 为准,该版本为 AndroidX 迁移后的版本):

dependencies { implementation 'com.marshalchen.ultimaterecyclerview:library:0.9.0' }

或者通过 Maven 引入:

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

由于依赖了google()仓库与 AndroidX 组件,构建环境需要能正常访问这两个仓库源。

在布局中使用 UltimateRecyclerView

在 XML 中声明方式与普通 RecyclerView 几乎一致:

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

组件还提供了一组自定义属性(定义于 attrs.xml 的UltimateRecyclerviewstyleable 中),可以在 XML 中直接完成初始化配置:

属性类型说明
recyclerviewPaddingdimension统一设置 RecyclerView 四边内边距(默认 -1.1f,即未启用)
recyclerviewPaddingTop/Bottom/Left/Rightdimension分别设置各方向内边距,默认 0
recyclerviewClipToPaddingboolean是否裁剪内边距,默认 false
recyclerviewEmptyViewreference空视图的布局资源 Id
recyclerviewFloatingActionViewreference悬浮按钮组的布局资源 Id
recyclerviewScrollbarsenum滚动条样式:none(0) /vertical(1) /horizontal(2)
recyclerviewDefaultSwipeColorreference下拉刷新默认配色的颜色数组资源

这些属性在UltimateRecyclerView.initAttrs()中通过TypedArray解析并作用于内部 RecyclerView,例如recyclerviewPadding会直接调用mRecyclerView.setPadding(),而recyclerviewScrollbars会选择 vertical_recycler_view.xml 或 horizontal_recycler_view.xml 替换内部布局,以叠加滚动条装饰。

适配器体系:UltimateViewAdapter 与 easyRegularAdapter

UltimateRecyclerView 的能力大多依赖其专属适配器基类 UltimateViewAdapter.java。它继承自RecyclerView.Adapter,同时实现了StickyRecyclerHeadersAdapter(吸附头部)与ItemTouchHelperAdapter(拖拽/滑动),是驱动"头部 + 数据 + 加载更多 Footer + 广告位"复合列表的关键。

内部视图类型(VIEW_TYPES)

UltimateViewAdapter定义了 7 种内部视图类型(见 UltimateViewAdapter.java):

  • NORMAL:普通数据项
  • HEADER:自定义头部
  • FOOTER:默认加载更多尾部
  • NOVIEW:空视图占位
  • ADVIEW:广告视图
  • CUSTOMVIEW:自定义扩展视图
  • SECTION:分组类型

getItemViewType()会根据"是否启用 LoadMore、是否有 Header、适配器数据量是否为 0"自动判定每个位置的类型,这也是 README 中"auto judge loadmore or header in adapter"(自动判定加载更多或头部)的实现基础。

抽象方法契约

继承UltimateViewAdapter需要实现的核心抽象方法:

  • getAdapterItemCount():返回真实数据项数量(不含头部/Footer 等装饰项)
  • onCreateViewHolder(ViewGroup):创建普通数据项 ViewHolder
  • newFooterHolder(View)/newHeaderHolder(View):创建尾部/头部 ViewHolder
  • generateHeaderId(int):为吸附头部生成分组 Id(不需要时返回 -1)
  • onBindViewHolder():绑定数据(内部已按视图类型分流)

getItemCount()由基类统一计算为getAdapterItemCount() + totalAdditionalItems(),其中totalAdditionalItems()在有 Header 时 +1、启用 LoadMore 时 +1,从而保证装饰项不污染数据位置。

内置便捷增删改方法

基类提供了线程安全的列表操作工具(内部以mLock对象锁保护数据),且自动处理 Header/Footer 带来的位置偏移:

  • insertInternal(list, item, position)/insertFirstInternal/insertLastInternal
  • insertInternal(newList, originalList):整批插入并触发notifyItemRangeInserted
  • removeInternal(list, position)/removeFirstInternal/removeLastInternal
  • clearInternal(list)/removeAllInternal(list):清空并依据空视图策略执行对应的移除通知
  • swapPositions(list, from, to):拖拽换位(自动阻止 Header 与 Footer 参与交换)

easyRegularAdapter:面向常规列表的快速适配器

quickAdapter/easyRegularAdapter.java 是面向"普通单布局列表"的简化实现,只需三个抽象方法即可工作:

public abstract class easyRegularAdapter<T, BINDHOLDER extends UltimateRecyclerviewViewHolder> extends UltimateViewAdapter { protected abstract int getNormalLayoutResId(); // 普通 item 布局 protected abstract BINDHOLDER newViewHolder(View view); // ViewHolder protected abstract void withBindHolder(BINDHOLDER holder, T data, int position); // 绑定数据 }

它内置了insert(item)、insertFirst、insertLast、removeAt、removeFirst、removeLast、removeAll、swapPositions(from, to)等公开方法,以及getItem(int)、getObjects()、isEmpty()、hasItem()等查询接口。getItemDataPosFromInternalPos()负责把"包含头部偏移的展示位置"换算回真实数据下标。

ViewHolder 基类

配套的 UltimateRecyclerviewViewHolder.java 实现了ItemTouchHelperViewHolder,提供:

  • findViewByIdEfficient(id):带 SparseArray 缓存的快速 findViewById
  • onBindView(Object)/updateView():数据绑定模板方法
  • onItemSelected()/onItemClear():拖拽选中/释放回调
  • swipeLayout字段:默认尝试从 item 中查找recyclerview_swipe布局以支持侧滑

下拉刷新与刷新配色

调用 UltimateRecyclerView.java 的setDefaultOnRefreshListener()即可启用内置的 SwipeRefreshLayout 并注册刷新回调:

ultimateRecyclerView.setDefaultOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { // 拉取最新数据 onFireRefresh(); } });

刷新结束或数据更新后,调用setRefreshing(false)关闭刷新动画。该方法的内部实现会先setEnabled(true)打开刷新能力,再通过setColorSchemeColors()设置配色——若在 XML 中配置了recyclerviewDefaultSwipeColor引用的颜色数组,则使用该配色;否则回退到 Android 内置的四色(蓝/绿/橙/红)。也可以在代码中通过setDefaultSwipeToRefreshColorScheme(int... colors)覆盖配色。注意:默认情况下mSwipeRefreshLayout.setEnabled(false)(见initViews()),即刷新功能是"按需开启"的。

加载更多:无限滚动与自定义底部视图

核心调用链

加载更多由滚动监听驱动。UltimateRecyclerView.setDefaultScrollListener()注册的内部OnScrollListener在每次滚动时调用scroll_load_more_detection():该方法先根据布局管理器类型(LINEAR/GRID/STAGGERED_GRID)计算首尾可见位置,当bottomEdgeHit(总项数 - 可见项数 <= 首个可见项位置)为 true 且加载更多开关开启时,触发onLoadMoreListener.loadMore(),随后调用mAdapter.internalExecuteLoadingView()显示底部加载视图。

按 BasicFunctions.java 的示例接入:

ultimateRecyclerView.setLoadMoreView(R.layout.custom_bottom_progressbar); // 自定义底部加载视图 ultimateRecyclerView.setOnLoadMoreListener(new UltimateRecyclerView.OnLoadMoreListener() { @Override public void loadMore(int itemsCount, int maxLastVisiblePosition) { // 模拟网络请求后追加数据 new Handler().postDelayed(new Runnable() { public void run() { onLoadmore(); // 向 adapter 插入新数据 } }, 500); } });

OnLoadMoreListener接口(UltimateRecyclerView.java)的回调签名为void loadMore(int itemsCount, int maxLastVisiblePosition),分别给出当前总项数与最后一个可见位置,便于分页逻辑判断。

自定义加载视图

setLoadMoreView(View)与setLoadMoreView(@LayoutRes int layout)均可设置底部加载视图;若传 null,UltimateRecyclerView会自动回退到默认的 bottom_progressbar.xml。视图的显示/隐藏由适配器侧的revealDispatchLoadMoreView()/removeDispatchLoadMoreView()控制。

启用与禁用

  • disableLoadmore():关闭加载更多(mIsLoadMoreWidgetEnabled = false,并调用mAdapter.enableLoadMore(false))
  • reenableLoadmore():重新开启加载更多
  • isLoadMoreEnabled():查询当前状态

从源码看,enableLoadMore(boolean)通过delayEnableLoadmore(一个Runnable)延迟切换状态,这是为了避免滚动过程中因数据变化导致的notifyItemRemoved位置不一致崩溃(RecyclerView的经典 "Invalid item position" 问题),加载视图的移除在延迟任务中执行。

空视图策略:EMPTY_* 与 STARTWITH_* 策略

UltimateRecyclerView内置了 ViewStub 形式的空视图(布局骨架见 ultimate_recycler_view_layout.xml 中的emptyview),并定义了 4 种空视图展示策略(UltimateRecyclerView.java):

常量值含义
EMPTY_CLEAR_ALL0数据清空时全部清除(含头部与加载项)
EMPTY_SHOW_LOADMORE_ONLY1只保留加载更多项
EMPTY_KEEP_HEADER2保留头部,移除加载项
EMPTY_KEEP_HEADER_AND_LOARMORE3头部与加载项都保留

以及 2 种初始化策略:

常量值含义
STARTWITH_OFFLINE_ITEMS0假定初始就有本地数据,adapter 数据为 0 时展示空视图
STARTWITH_ONLINE_ITEMS1假定初始从网络加载,先隐藏空视图并显示加载

使用方式(来自 demo 的 BasicFunctions.java):

ultimateRecyclerView.setEmptyView(R.layout.empty_view, UltimateRecyclerView.EMPTY_CLEAR_ALL);

setEmptyView()有多个重载,可额外传入初始化策略与emptyViewOnShownListener监听(空视图展示回调)。空视图的展示判断在updateHelperDisplays()中:当 adapter 数据量变为 0 且策略允许时显示;数据恢复后自动隐藏。也可以手动调用showEmptyView()/hideEmptyView()控制。

头部视图:视差头部与普通头部

// 视差头部(随滚动以 0.5 倍速平移) ultimateRecyclerView.setParallaxHeader(getLayoutInflater() .inflate(R.layout.parallax_recyclerview_header, ultimateRecyclerView.mRecyclerView, false)); // 普通头部 ultimateRecyclerView.setNormalHeader(headerView);

从源码看,setParallaxHeader(View)会把传入视图包装进CustomRelativeWrapper,setNormalHeader(View)则复用同一套包装但关闭视差开关。视差效果在默认滚动监听中实现:mTotalYScrolled += dy累计滚动距离,再以SCROLL_MULTIPLIER = 0.5f的系数调用translateHeader()产生位移动画。通过setOnParallaxScroll(OnParallaxScroll)还可以拿到滚动百分比,demo 中用它来渐变 Toolbar 背景透明度:

ultimateRecyclerView.setOnParallaxScroll(new UltimateRecyclerView.OnParallaxScroll() { @Override public void onParallaxScroll(float percentage, float offset, View parallax) { Drawable c = toolbar.getBackground(); c.setAlpha(Math.round(127 + percentage * 128)); } });

注意:视差头部基于 FrameLayout 平移实现,头部高度大于一屏或滚动越界时效果会受of < mHeader.getHeight()条件约束。

拖拽排序、滑动删除与滑动刷新联动

拖拽能力由 DragDropTouchListener.java 与 dragsortadapter 包提供,配合UltimateViewAdapter.onItemMove(from, to)实现换位。在 demo 的 SimpleAdapter.java 中可以看到标准写法:onItemMove内先调用swapPositions(fromPosition, toPosition)交换数据,再super.onItemMove()触发notifyItemMoved;onItemDismiss内调用remove(position)删除数据。拖拽时 ViewHolder 的onItemSelected()/onItemClear()可用于高亮被拖拽项。

滑动删除另有独立实现 SwipeDismissTouchListener.java 与可整体替换的 SwipeableUltimateRecyclerview.java。此外还内置了基于 SwipeLayout 的侧滑菜单能力(drag_edge、swipeMode、swipeActionLeft/Right等属性定义于 attrs.xml),demo 布局 item_swipeable.xml 展示了前后两层视图的侧滑结构。

吸附头部(Sticky Header)

吸附头部逻辑位于 stickyheadersrecyclerview 包,核心是StickyRecyclerHeadersDecoration装饰器与StickyRecyclerHeadersAdapter接口。UltimateViewAdapter已实现该接口,使用方式:

  1. 在适配器中实现generateHeaderId(int position)返回分组 Id(demo 中按字符串首字符分组);
  2. 实现onCreateHeaderViewHolder()与onBindHeaderViewHolder()创建并绑定头部;
  3. 在页面中给 RecyclerView 添加装饰器:
StickyRecyclerHeadersDecoration headersDecor = new StickyRecyclerHeadersDecoration(simpleRecyclerViewAdapter); ultimateRecyclerView.addItemDecoration(headersDecor);

demo 的头部布局见 stick_header_item.xml。吸附头部在滚动时会固定在顶部,直到下一分组头部进入,效果与 Instagram 列表一致。

多布局与广告位注入

多视图类型适配器

UltimateDifferentViewTypeAdapter.java 与 UltimateGridLayoutAdapter.java 支撑不同 item 布局混合展示;demo 中 multiitemdemo 提供了两种 binder(Sample1Binder.java、Sample2Binder.java)的完整示例。

广告位注入(AdmobAdapter)

quickAdapter/AdmobAdapter.java 在列表数据流中按频率插入广告视图(对应VIEW_TYPES.ADVIEW),构造参数:

  • adview:广告视图(ViewGroup 子类)
  • insertOnce:true 表示广告只插入一次;false 表示按固定间隔循环插入
  • setInterval:广告出现的数据项间隔(内部换算为adfrequency = setInterval + 1)
  • 可选AdviewListener:在广告即将出现在屏幕附近时生成广告视图

adapter 会通过isOnAdView(pos)判断当前位置是否为广告位,并在getItemDataPosFromInternalPos()中扣除广告位偏移,保证数据与广告的位置换算正确。demo 参考 admobdemo。

动画体系

适配器加载动画

UltimateViewAdapter.getAdapterAnimations()(UltimateViewAdapter.java)内置 5 种基于 ObjectAnimator 的入场动画,对应枚举AdapterAnimationType:

  • AlphaIn:透明度 0.5 → 1
  • SlideInBottom:自底部滑入(translationY 从视图高度到 0)
  • ScaleIn:缩放 0.5 → 1
  • SlideInLeft/SlideInRight:自左右两侧滑入

配合 SimpleAnimationAdapter.java(demo 中的动画适配器装饰类)即可为列表加载添加动画。注意此类动画基于属性动画,最低要求 API 11(Honeycomb,源码标注@TargetApi(Build.VERSION_CODES.HONEYCOMB))。

Item 增删动画

与 RecyclerView 一致,通过setItemAnimator(RecyclerView.ItemAnimator)设置 ItemAnimator(默认DefaultItemAnimator)。demo 的 BasicFunctions.java 展示了如何用 AnimationType.java 枚举切换不同动画器并设置时长:

ultimateRecyclerView.setItemAnimator(AnimationType.values()[position - 1].getAnimator()); ultimateRecyclerView.getItemAnimator().setAddDuration(300); ultimateRecyclerView.getItemAnimator().setRemoveDuration(300);

滚动联动:隐藏/显示 Toolbar 与悬浮按钮

通过setScrollViewCallbacks(ObservableScrollViewCallbacks)注册滚动回调,在onUpOrCancelMotionEvent中根据滚动方向(ObservableScrollState.UP/DOWN)控制 Toolbar 与 FAB 的显隐(demo 写法见 BasicFunctions.java):

ultimateRecyclerView.setScrollViewCallbacks(new ObservableScrollViewCallbacks() { @Override public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) { } @Override public void onUpOrCancelMotionEvent(ObservableScrollState observableScrollState) { if (observableScrollState == ObservableScrollState.UP) { ultimateRecyclerView.hideToolbar(toolbar, ultimateRecyclerView, getScreenHeight()); ultimateRecyclerView.hideFloatingActionMenu(); } else if (observableScrollState == ObservableScrollState.DOWN) { ultimateRecyclerView.showToolbar(toolbar, ultimateRecyclerView, getScreenHeight()); ultimateRecyclerView.showFloatingActionMenu(); } } }); ultimateRecyclerView.showFloatingButtonView();

滚动状态机的计算集中在enableShoworHideToolbarAndFloatingButton():它逐项累计子视图高度估算 scrollY(跳过多项时用首可见项高度近似,源码注释中已说明该近似可能导致底部回滚时 scrollY 不精确),并记录ObservableScrollState(UP 向下滚 / DOWN 向上滚 / STOP 停止)。悬浮按钮默认是一个AddFloatingActionButton(见 ultimate_recycler_view_layout.xml),也可通过recyclerviewFloatingActionView属性指定自定义 FAB 组布局。

布局管理器:线性、网格与瀑布流

UltimateRecyclerView支持三种标准 LayoutManager,滚动加载检测在 scroll_load_more_detection() 中按类型分别计算首尾可见位置;不支持的 LayoutManager 会抛出RuntimeException。LAYOUT_MANAGER_TYPE枚举定义了LINEAR、GRID、STAGGERED_GRID、PUZZLE四类。

库内还提供了若干扩展管理器(layoutmanagers 包):

  • ScrollSmoothLineaerLayoutManager:平滑线性滚动
  • CustomLinearLayoutManager:自定义线性管理器
  • ClassicSpanGridLayoutManager:网格管理器(demo 的configGridLayoutManager中以 2 列使用)

demo 中的配置示例:

// 瀑布流:3 列纵向 StaggeredGridLayoutManager sglm = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL); rv.setLayoutManager(sglm); // 网格:2 列 ClassicSpanGridLayoutManager mgm = new ClassicSpanGridLayoutManager(this, 2, ad); rv.setLayoutManager(mgm); // 线性:纵向、禁用翻转、滚动时长 300ms ScrollSmoothLineaerLayoutManager lgm = new ScrollSmoothLineaerLayoutManager(this, LinearLayoutManager.VERTICAL, false, 300); rv.setLayoutManager(lgm);

网格与瀑布流演示见 griddemo(含 GridLayoutRVTest.java、GridJRAdapter.java 等)。

其他常用 API 速查

以下方法均定义于 UltimateRecyclerView.java,可直接调用:

方法作用
setAdapter(UltimateViewAdapter)/swapAdapter(adapter, recycle)设置/交换适配器(内部注册数据观察者、同步空视图与 LoadMore 状态)
setLayoutManager(RecyclerView.LayoutManager)设置布局管理器
addItemDecoration(...)添加装饰器(分割线等,内置DividerItemDecoration)
setHasFixedSize(boolean)固定尺寸优化
setRefreshing(boolean)手动控制刷新动画
enableDefaultSwipeRefresh(boolean)开关下拉刷新
addOnScrollListener(...)/removeOnScrollListener(...)自定义滚动监听
setRecylerViewBackgroundColor(int)设置列表背景色
getEmptyView()获取空视图
showEmptyView()/hideEmptyView()手动显隐空视图

版本演进与兼容性

README 的 Version Log 记录了项目演进脉络,可作为版本选型依据:

  • v0.8.0:迁移到 AndroidX(当前推荐基线)
  • v0.7.0:支持 RecyclerView 24.0.0 的大部分特性,改进 UltimateAdapter,缩减库体积并修复若干 bug
  • v0.5.8:基于 support library 23.4.0,修复加载更多/禁用加载更多的过早触发问题
  • v0.5.6:基于 23.3.0,最低支持到 v13,新增TimeLineView节点连接器(LinearLayoutManager 下逐项绘制时间线节点)
  • v0.5.0:升级到 v23.2.1
  • v0.4.9:最后一个基于 V23.1.1 的版本
  • v0.3.11:基于 support library 22.x 的老版本

当前仓库的模块构建配置位于 ultimaterecyclerview 目录,demo 应用位于 app 目录(含 AndroidManifest.xml),可通过仓库根目录的 gradlew 包装脚本编译运行示例。

Demo 应用与示例代码

仓库自带完整 demo 工程,源码位于 app/src/main/java/com/marshalchen/ultimaterecyclerview/demo,按功能分包组织,是学习各特性的最佳入口:

  • loadmoredemo:加载更多、下拉刷新、空视图、视差头部、滚动联动(BasicFunctions.java是各 Activity 的公共基类)
  • dragdemo:拖拽排序
  • griddemo:网格与瀑布流
  • multiitemdemo:多布局混排
  • expandemo:可展开列表
  • admobdemo:广告位注入
  • swiplistdemo:侧滑列表

时间线节点能力可参考 timelineview 包与 TimeLineAdapter.java;可展开列表的适配器实现见 expanx/LinearExpanxURVAdapter.java。

开源协议与致谢

UltimateRecyclerView 基于 Apache License 2.0 开源(LICENSE,Copyright 2014-present Marshal Chen),可自由用于商业项目。README 的 Thanks 部分列出了一批借鉴/集成的开源组件:recyclerview-animators(动画器)、SuperRecyclerView(多 LayoutManager 处理)、RecyclerView-FlexibleDivider(分割线)、android-parallax-recyclerview(视差头部)、floating-action-button(FAB)、Ultra Pull To Refresh(多彩刷新)、recyclerview-stickyheaders(吸附头部)与 AndroidSwipeLayout(侧滑)。这些上游项目的能力在库内经过整合与再封装,形成了本文所述的统一 API。

小结

UltimateRecyclerView 的价值在于:把下拉刷新、加载更多、拖拽、侧滑、吸附头、空视图、滚动联动等高频列表需求一次性内置,同时保留 RecyclerView 的编程模型(Adapter + LayoutManager + ItemDecoration + ItemAnimator),接入成本低、扩展面广。使用时注意三点:适配器优先继承UltimateViewAdapter或其子类以享受头部/加载项/空视图的内置支持;数据增删尽量走基类提供的insertInternal/removeInternal/clearInternal工具方法以保证通知与位置偏移正确;版本选择以支持 AndroidX 的 v0.8.0+ 为基线。详细源码与示例可继续阅读 UltimateRecyclerView.java 与 UltimateViewAdapter.java。

  • 移动开发
  • UI组件

【免费下载链接】UltimateRecyclerView

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

项目地址:https://gitcode.com/gh_mirrors/ul/UltimateRecyclerView
点击查看免费下载
上一篇:Deepagents供应链管理:优化物流和库存的AI代理终极指南
下一篇:3分钟掌握TensorRT模型序列化:从优化到部署的性能飞跃

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询