# 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/v/RickyHal/EQList.svg)](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