# ByRecyclerView
**Repository Path**: mirrors/ByRecyclerView
## Basic Information
- **Project Name**: ByRecyclerView
- **Description**: ByRecyclerView 是基于 RecyclerView 的扩展,提供了上拉刷新、加载更多、 添加 HeaderView/FooterView、setStateView、it
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: https://www.oschina.net/p/byrecyclerview
- **GVP Project**: No
## Statistics
- **Stars**: 10
- **Forks**: 6
- **Created**: 2020-02-26
- **Last Updated**: 2025-08-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ByRecyclerView
[![jitpack][1]][2]
[![API][5]][6]
[![Apache License 2.0][3]][4]
[![download][7]][8]
ByRecyclerView 提供了下拉刷新、上拉松手/自动加载更多、 添加HeaderView/FooterView、setStateView、item点击/长按、item局部刷新、万能分割线、粘性header、极简Adapter(databinding)等功能。
## 功能特性
- 1.下拉刷新 / 支持SwipeRefreshLayout
- 2.自定义 下拉刷新布局 / 加载更多布局
- 3.加载更多机制:**上拉松手 / 自动加载更多**
- 4.Add HeaderView、FooterView、StateView
- 5.item及子view的点击/长按事件(防止重复点击)
- 6.item 局部刷新
- 7.优化过的BaseAdapter (RV/LV),减少大量代码
- 8.Adapter结合DataBinding/ViewBinding使用 (RV/LV)
- 9.可添加 万能分隔线(线性/宫格/瀑布流)
- 10.可配置 Skeleton骨架图
- 11.仿京东首页 RecyclerView嵌套滑动置顶示例
- 12.可配置自动加载更多机制 和 设置预加载条数
> 最新:setPageData()一行代码处理 列表显示数据和空视图
## Document
- [项目介绍](https://github.com/youlookwhat/ByRecyclerView/wiki/%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D) | [wiki示例文档](https://github.com/youlookwhat/ByRecyclerView/wiki) | [更新日志 (1.4.2)](https://github.com/youlookwhat/ByRecyclerView/wiki/Update-log)
- [ByRecyclerView:更方便的使用下拉刷新及加载更多](https://juejin.im/post/5e0980fbe51d4558083345fc)
- [ByRecyclerView:真·万能分割线 (线性/宫格/瀑布流)](https://juejin.im/post/5e4ff123e51d4527255ca2e1)
- [RecyclerView嵌套滑动置顶 项目应用篇](https://juejin.cn/post/6941996743974191111)
## Screenshots

### 下载试用
[AndroidX版本(Apk-Demo)](https://github.com/youlookwhat/download/raw/main/ByRecyclerView.apk)
## 如何使用
> 建议直接看 [示例代码](https://github.com/youlookwhat/ByRecyclerView/blob/master/app/src/main/java/me/jingbin/byrecyclerview/MainActivity.java) 或 [Wiki文档](https://github.com/youlookwhat/ByRecyclerView/wiki)
### 快速开始
1.先在 build.gradle 的 repositories 添加
```
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
```
2.然后在dependencies添加
```
dependencies {
// AndroidX版本引入
implementation 'com.github.youlookwhat:ByRecyclerView:1.4.2'
}
```
3.在XML布局中引用 ByRecyclerView
```xml
```
4.使用BaseRecyclerAdapter
```java
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(new BaseRecyclerAdapter(R.layout.item_main, list) {
@Override
protected void bindView(BaseByViewHolder holder, String bean, int position) {
holder.setText(R.id.tv_text, bean);
}
});
mAdapter.setNewData(list); // 设置第一页数据
```
5.设置监听
```java
// 下拉刷新监听
mRecyclerView.setOnRefreshListener(new ByRecyclerView.OnRefreshListener() {
@Override
public void onRefresh() {
// 刷新完成
mRecyclerView.setRefreshing(false);
}
});
// 加载更多监听
mRecyclerView.setOnLoadMoreListener(new ByRecyclerView.OnLoadMoreListener() {
@Override
public void onLoadMore() {
mAdapter.addData(list); // 设置及刷新数据
mRecyclerView.loadMoreComplete(); // 加载更多完成
mRecyclerView.loadMoreEnd(); // 没有更多内容了
mRecyclerView.loadMoreFail(); // 加载更多失败,点击重试
}
});
```
6.显示数据
可直接调用adapter方法:`setPageData(boolean isFirstPage, List data, int emptyLayoutId)`
```java
/**
* 设置数据 和 处理空视图。
* 如果想列表上方显示状态视图(StateView),不能使用这个方法。
*
* @param isFirstPage 是否是第一页
* @param data 需要设置的数据
* @param emptyView 空视图的View
*/
public void setPageData(boolean isFirstPage, List data, View emptyView) {
if (mRecyclerView == null) {
return;
}
if (isFirstPage) {
// 第一页
if (data != null && data.size() > 0) {
// 有数据
mRecyclerView.setStateViewEnabled(false);
mRecyclerView.setLoadMoreEnabled(true);
setNewData(data);
} else {
// 没数据,设置空布局
if (emptyView != null) {
mRecyclerView.setStateView(emptyView);
}
mRecyclerView.setLoadMoreEnabled(false);
setNewData(null);
}
} else {
// 第二页
if (data != null && data.size() > 0) {
// 有数据,显示更多数据
addData(data);
mRecyclerView.loadMoreComplete();
} else {
// 没数据,显示加载到底
mRecyclerView.loadMoreEnd();
}
}
}
```
### 自动加载更多/预加载
为了适配更多的加载场景,我们增加了自动加载更多的机制,也可以设置预加载的条数,即滑动到倒数第`preLoadNumber `条数据时执行加载更多,相比以前只用在设置监听时加上状态`true`即可,使用方式:
```java
void setOnLoadMoreListener(boolean isAutoLoadMore, OnLoadMoreListener listener)
void setOnLoadMoreListener(boolean isAutoLoadMore, int preLoadNumber, OnLoadMoreListener listener)
/**
* 设置加载更多监听
*
* @param isAutoLoadMore 是否自动加载
* @param preLoadNumber 自动加载时,默认滑动到倒数第[preLoadNumber]条数据加载,默认1
* @param listener 监听器
* @param delayMillis 延迟多少毫秒执行加载更多
*/
void setOnLoadMoreListener(boolean isAutoLoadMore, int preLoadNumber, OnLoadMoreListener listener, long delayMillis)
```
- 1. 如果不设置,默认还是使用上拉松手加载更多机制
- 2. 设置后如果想取消自动加载还是使用`recyclerView.setLoadMoreEnabled(false);`
- 3. 不满一屏不加载更多`setNotFullScreenNoLoadMore()`,只对上拉松手加载更多有效
### ItemDecoration
万能分割线,可给Linear/Grid/StaggeredGrid设置,并可配置去除不显示分割线的头部和尾部个数
1.给LinearLayout设置分割线
```java
// 选择1:设置drawable
SpacesItemDecoration itemDecoration = new SpacesItemDecoration(this, SpacesItemDecoration.VERTICAL)
.setNoShowDivider(1, 1) // 第一个参数:头部不显示分割线的个数,第二个参数:尾部不显示分割线的个数,默认为1
.setDrawable(R.drawable.shape_line);// 设置drawable文件
// 选择2:设置颜色、高度、间距等
SpacesItemDecoration itemDecoration = new SpacesItemDecoration(this, SpacesItemDecoration.VERTICAL)
.setNoShowDivider(1, 1)
// 颜色,分割线间距,左边距(单位dp),右边距(单位dp)
.setParam(R.color.colorBlue, 10, 70, 70);
recyclerView.addItemDecoration(itemDecoration);
```
2.给宫格/瀑布流设置分割线
```java
// 10:间距; true:距屏幕周围是否也有间距
GridSpaceItemDecoration itemDecoration = new GridSpaceItemDecoration(10, true)
.setNoShowSpace(1, 1);// 第一个参数:头部不显示分割线的个数,第二个参数:尾部不显示分割线的个数,默认为1
recyclerView.addItemDecoration(itemDecoration);
```
### add HeaderView/FooterView、setStateView
```java
// 获取view对应databinding,注意:recyclerView.getParent()
LayoutHeaderViewBinding headerBinding = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.layout_header_view, (ViewGroup) binding.recyclerView.getParent(), false);
recyclerView.addHeaderView(headerBinding.getRoot());
recyclerView.addFooterView(getView() / layoutId));
recyclerView.setStateView(getView() / layoutId);
// headerView、footerView、setStateView 支持一键隐藏,设置后需要notify
recyclerView.setHeaderViewEnabled(false);
recyclerView.setFootViewEnabled(false);
recyclerView.setStateViewEnabled(false);
```
### Item 点击/长按监听
```java
// 防重复点击使用 OnItemFilterClickListener
mRecyclerView.setOnItemClickListener(new ByRecyclerView.OnItemClickListener() {
@Override
public void onClick(View v, int position) {
// 通过adapter获取对应position的数据
DataItemBean itemData = mAdapter.getItemData(position);
}
});
mRecyclerView.setOnItemLongClickListener(new ByRecyclerView.OnItemLongClickListener() {
@Override
public boolean onLongClick(View v, int position) {
return false;
}
});
// 添加 子View的点击/长按事件
holder.addOnClickListener(R.id.tv_text);
holder.addOnLongClickListener(R.id.tv_text);
// 防重复点击使用 OnItemChildFilterClickListener
recyclerView.setOnItemChildClickListener(new ByRecyclerView.OnItemChildClickListener() {
@Override
public void onItemChildClick(View view, int position) {
}
});
recyclerView.setOnItemChildLongClickListener(new ByRecyclerView.OnItemChildLongClickListener() {
@Override
public void onItemChildLongClick(View view, int position) {
}
});
```
### Item 局部刷新
```java
// 设置要局部刷新的position及payload
adapter.refreshNotifyItemChanged(position, PayloadAdapter.PAYLOAD_COLLECT);
// adapter里额外再继承 bindViewPayloads 方法
@Override
protected void bindViewPayloads(@NonNull BaseBindingHolder holder, @NonNull DataItemBean bean, @NonNull ItemPayloadBinding binding, int position, @NonNull List