- 移动开发
- UI组件
【免费下载链接】UltimateRecyclerView
A RecyclerView(advanced and flexible version of ListView in Android) with refreshing,loading more,animation and many other features.
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 SwipeRefreshLayout | setDefaultOnRefreshListener()、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 中直接完成初始化配置:
| 属性 | 类型 | 说明 |
|---|---|---|
recyclerviewPadding | dimension | 统一设置 RecyclerView 四边内边距(默认 -1.1f,即未启用) |
recyclerviewPaddingTop/Bottom/Left/Right | dimension | 分别设置各方向内边距,默认 0 |
recyclerviewClipToPadding | boolean | 是否裁剪内边距,默认 false |
recyclerviewEmptyView | reference | 空视图的布局资源 Id |
recyclerviewFloatingActionView | reference | 悬浮按钮组的布局资源 Id |
recyclerviewScrollbars | enum | 滚动条样式:none(0) /vertical(1) /horizontal(2) |
recyclerviewDefaultSwipeColor | reference | 下拉刷新默认配色的颜色数组资源 |
这些属性在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):创建普通数据项 ViewHoldernewFooterHolder(View)/newHeaderHolder(View):创建尾部/头部 ViewHoldergenerateHeaderId(int):为吸附头部生成分组 Id(不需要时返回 -1)onBindViewHolder():绑定数据(内部已按视图类型分流)
getItemCount()由基类统一计算为getAdapterItemCount() + totalAdditionalItems(),其中totalAdditionalItems()在有 Header 时 +1、启用 LoadMore 时 +1,从而保证装饰项不污染数据位置。
内置便捷增删改方法
基类提供了线程安全的列表操作工具(内部以mLock对象锁保护数据),且自动处理 Header/Footer 带来的位置偏移:
insertInternal(list, item, position)/insertFirstInternal/insertLastInternalinsertInternal(newList, originalList):整批插入并触发notifyItemRangeInsertedremoveInternal(list, position)/removeFirstInternal/removeLastInternalclearInternal(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 缓存的快速 findViewByIdonBindView(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_ALL | 0 | 数据清空时全部清除(含头部与加载项) |
EMPTY_SHOW_LOADMORE_ONLY | 1 | 只保留加载更多项 |
EMPTY_KEEP_HEADER | 2 | 保留头部,移除加载项 |
EMPTY_KEEP_HEADER_AND_LOARMORE | 3 | 头部与加载项都保留 |
以及 2 种初始化策略:
| 常量 | 值 | 含义 |
|---|---|---|
STARTWITH_OFFLINE_ITEMS | 0 | 假定初始就有本地数据,adapter 数据为 0 时展示空视图 |
STARTWITH_ONLINE_ITEMS | 1 | 假定初始从网络加载,先隐藏空视图并显示加载 |
使用方式(来自 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已实现该接口,使用方式:
- 在适配器中实现
generateHeaderId(int position)返回分组 Id(demo 中按字符串首字符分组); - 实现
onCreateHeaderViewHolder()与onBindHeaderViewHolder()创建并绑定头部; - 在页面中给 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 → 1SlideInBottom:自底部滑入(translationY 从视图高度到 0)ScaleIn:缩放 0.5 → 1SlideInLeft/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.
相关推荐
如何快速实现RecyclerView加载更多:基于android-advancedrecyclerview的终极方案
如何快速实现RecyclerView加载更多:基于android advancedrecyclerview的终极方案 android advancedrecyc
移动开发UI组件解决RecyclerView吸附难题:MultiSnapRecyclerView全方位实战指南
解决RecyclerView吸附难题:MultiSnapRecyclerView全方位实战指南 你是否还在为RecyclerView无法实现精准吸附而烦恼?是否
Vue.Draggable拖拽吸附辅助线显示时机:拖拽时显示
Vue.Draggable拖拽吸附辅助线显示时机:拖拽时显示 在使用Vue.Draggable实现拖拽功能时,拖拽吸附辅助线的显示时机控制是提升用户体验的关键。
前端UI组件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考