# EQList
**Repository Path**: Rickyal/EQList
## Basic Information
- **Project Name**: EQList
- **Description**: EQList(E-QuickList)是一款Kotlin实现的功能强大的RecyclerView渲染框架,使用DSL方式快速构建RecyclerView,无需实现Adapter和ViewHolder。
- **Primary Language**: Kotlin
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-12-29
- **Last Updated**: 2021-12-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# EQList
EQList(E-QuickList)[](https://jitpack.io/#RickyHal/EQList)是一款Kotlin实现的功能强大的RecyclerView渲染框架,使用DSL方式快速构建RecyclerView,无需实现Adapter和ViewHolder。[GitHub](https://github.com/RickyHal/EQList),Demo下载
目前支持的功能:
- [x] 支持MultiViewType
- [x] 支持Header和Footer
- [x] 支持自定义状态UI
- [x] 支持自定义加载更多UI
- [x] 支持自定义加载更多完成UI显示时间
- [x] 支持自定义页面数据离线缓存
- [x] 支持自动数据加载以及分页
- [x] 支持控制触发加载更多的条件
- [x] 支持DataBinding,ViewBinding
- [x] 支持自定义LayoutManager
- [x] 支持FullSpan
- [x] 支持DiffUtil
- [x] 支持Payload更新
# 依赖配置
项目 build.gradle
```groovy
allprojects {
repositories {
...
maven { url 'https://www.jitpack.io' }
}
}
```
模块 build.gradle
```groovy
dependencies {
implementation 'com.github.RickyHal:EQList:$latest_version'
}
```
# 使用方法
日常开发中我们常常会渲染两种类型的RecyclerView,一种是不需要加载更多的,一种是需要加载更多的,EQList分开处理了这两种情况。
## 基本概念
在使用之前你需要先了解本框架的几个基本概念。
### DataSource
你可以理解为一个ArrayList,用于存储你要渲染的数据,当你通过DataSource的增删改除方法修改数据时,DataSource内部会自动通知RecyclerView更新UI。DataSource内部有许多同ArrayList类似的方法,供操作数据使用,具体请查看源码。
DataSource用于不需要加载更多的情况。
### LoadableDataSource
同DataSource一样,但是多了一些方法,用于需要加载更多的情况。LoadableDataSource是一个抽象类,需要自己继承重写。
### LoadParam
网络请求时的参数,包含三个字段,pageLimit(每页加载数),index(索引值),extra(额外的数据,是一个Bundle)。
### LoadResult
加载结果,需要在LoadableDataSource的load方法中返回,有LoadResult.Success和LoadResult.Error两种类型。
### Item
可以理解为RecyclerView中的一项,如用户列表中的一个用户。
### BaseEntity
基础实体类,渲染数据列表时传入的实体类需要继承自此类
### StateEntity
加载状态实体类,继承自BaseEntity,包含STATE_HIDE、STATE_EMPTY、STATE_ERROR三个状态
### LoadState
加载状态,包含STATE_SHOW、STATE_START、STATE_SUCCESS、STATE_ERROR、STATE_EMPTY、STATE_HIDE等几个状态
### Header/Footer
数据列表顶部或底部的独立出来的item,当调用DataSource的removeAll()方法时,会清空列表中除Header和Footer的所有item,框架中的加载更多item就是一个自定义的Footer。
## 渲染不可加载更多的列表
举个🌰,先在ViewModel创建DataSource
```kotlin
data class User(val id: Int, val name: String) : BaseEntity()
class DemoViewModel : ViewModel() {
val dataSource: DataSource = DataSource(viewModelScope)
fun add() {
dataSource.add(User(dataSource.size() + 1, "张三"))
}
}
```
然后初始化RecyclerView:
```kotlin
binding.recyclerView.init(viewModel.dataSource, layoutManager) {
// 是否打开Debug模式,方便调试
withDebug(true)
onAttach {
// 相当Adapter中的onAttachedToRecyclerView方法,
}
onDetach {
// 相当Adapter中的onDetachedFromRecyclerView方法,
}
// 定义一种类型的Item,不使用ViewBinding
// User为Item对应的实体类,需要继承BaseEntity
item(R.layout.item_user) {
// LayoutManager为GridLayoutManager或StaggeredGridLayoutManager时是否拉通为一行
withFullSpan(true)
onCreate { view ->
// 相当Adapter中的onCreateViewHolder方法,view为创建的View
}
onBind { position, data, view ->
// 相当Adapter中的onBindViewHolder方法,data为对应位置的User
// 可在此更新Item UI
view.findViewById(R.id.tv_user_name).text = data.name
}
onBindPayload { position, data, view, payloads ->
// 相当Adapter中的onBindViewHolder方法,data为对应位置的User,payload为更新DataSource时传入的payload
// 可在此局部更新Item UI
}
onRecycle { view ->
// 相当Adapter中的onViewRecycled方法,
}
onItemAttach { view ->
// 相当Adapter中的onViewAttachedToWindow方法,
}
onItemDetach { view ->
// 相当Adapter中的onViewDetachedFromWindow方法,
}
}
// 使用ViewBinding
bindingItem(R.layout.item_user) {
// 同item
withFullSpan(true)
onCreate { view ->
// 同item,需要返回Binding
ItemUserBinding.bind(view)
}
onBind { position, data, binding ->
// 同item
}
onBindPayload { position, data, binding, payloads ->
// 同item
}
onRecycle { binding ->
// 同item
}
onItemAttach { binding ->
// 同item
}
onItemDetach { binding ->
// 同item
}
}
// 当网络不可用或下拉刷新数据为空时显示,会覆盖在整个RecyclerView上
stateItem(R.layout.item_state) {
onCreate { view ->
// 同item
}
onBind { position, data, view ->
// 同item,data为对应的状态,有STATE_HIDE、STATE_EMPTY、STATE_ERROR三种状态
// 通过data.state取状态
// 可通过retry()方法重新发起请求
view.findViewById