Skip to content

Commit

Permalink
优化
Browse files Browse the repository at this point in the history
  • Loading branch information
Knightwood committed Apr 16, 2023
1 parent ac99512 commit b5111a2
Show file tree
Hide file tree
Showing 8 changed files with 220 additions and 191 deletions.
250 changes: 111 additions & 139 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,107 +12,64 @@
implementation 'com.github.Knightwood:RecyclerViewNeko:Tag'
}
```

* 简单示例方式

```
## 快速开始

inner class Delegate1 : ItemViewDelegate<String>(1, R.layout.item_1) {
/**
* 绑定数据到viewholder
*/
override fun convert(holder: BaseViewHolder, data: String, position: Int) {
holder.getView<TextView>(R.id.tv1)?.text = data.toString()
}
}
inner class Delegate2 : ItemViewDelegate<String>(2, R.layout.item_2) {
override fun convert(holder: BaseViewHolder, data: String, position: Int) {
holder.getView<TextView>(R.id.tv2)?.text = data.toString()
}
}
fun initRv(){
//预定义数据
```
//预定义数据
val d: MutableList<String> = mutableListOf()
d.addAll(listOf("a", "b", "c", "item"))
//两个viewholder类型
val item1 = Delegate1()
val item2 = Delegate2()
//泛型指定了此recyclerview显示什么类型的数据
val neko = neko<String>(rv) {
//在有多种viewholder时,根据数据类型返回不同的viewtype
viewTypeParser = ViewTypeParser<String> { data, pos ->
if (data == "item") 1 else 2
//内置默认LinearLayoutManager,可以在这里修改
//layoutManager=GridLayoutManager(this@MainActivity2,2) //替换默认的布局管理器
layoutManager.apply {
//修改布局管理器的配置
}
//1. 多种viewtype可以使用[addItemViews]将多种viewholder添加进去
addItemViews(item1, item2)
//给整个itemview设置点击事件
itemClickListener = ItemClickListener { view, holder, position ->
Toast.makeText(applicationContext, mDatas[position], Toast.LENGTH_LONG).show()
//添加"viewholder"
addSingleItemView(R.layout.item_1) { holder, data, position ->
//数据绑定到viewholder
holder.getView<TextView>(R.id.tv1)?.text = data.toString()
}
}.show(d)//调用show方法完成recycleview的显示,并传入数据显示
// .....
}.show(d)//调用show方法完成recycleview的显示
//刷新数据
(neko.iNekoAdapter as NekoAdapter).notifyItemChanged(1)
//刷新数据
neko.refreshData(d)
}
}
//刷新数据
neko.nekoAdapter.notifyItemChanged(3)
```




0. 调用neko方法,传入相应设置就可以显示列表
## 示例

```
例如
1. 定义itemviewDelegate
class Delegate1 : ItemViewDelegate<String>(viewtype, 布局id) {
override fun convert(holder: BaseViewHolder, data: String, position: Int) {
//数据绑定到viewholder
}
class MainActivity2 : AppCompatActivity() {
lateinit var handler: Handler
lateinit var rv: RecyclerView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
handler = Handler(Looper.getMainLooper())
rv = findViewById<View>(R.id.rv) as RecyclerView
}
2.组装recyclerview并显示
val rvNeko=xxxNeko<数据类型>(rv){
//配置
addItemViews()//添加itemviewDelegate
addItemView()//添加itemviewDelegate,但不能和上面的混用
}.show(datas) //就此完成recyclerview显示
3.数据刷新,不同的XXXNeko将会给予不同的config实例,通过此实例获取相应的adapter用于数据刷新等
rvNeko.相应adapter.数据刷新()
4. 对于多种viewholder
有两种方式指定:
一是重写ItemViewDelegate中的isForViewType方法
二是在xxxNeko配置recyclerview时传入ViewTypeParser解析viewtype
注:两种方式不会同时生效,优先ViewTypeParser生效,但调用addItemView方法添加itemviewDelegate会另isForViewType方法优先
xxxNeko<数据类型>(rv){
//配置
//指定viewtype解析器
viewTypeParser = ViewTypeParser<String> { data, pos ->
if (data == "item") 1 else 2
}
}
5.两种添加itemviewDelegate方法:
addItemViews()//添加itemviewDelegate
addItemView()//添加itemviewDelegate,但不能和上面的混用
两种都可以做到单一/多种类的viewholder
```
override fun onStart() {
super.onStart()
handler.postDelayed(Runnable {
//这里延迟5s是为了测试时避免出问题时闪退太快收集不到日志
// nekoTest()
concatTest()

## 使用ItemViewDelegate取代viewholder, 在ItemViewDelegate中绑定数据

```
}, 5000)
}
/**
* 代替viewholder
Expand All @@ -125,9 +82,7 @@ xxxNeko<数据类型>(rv){
holder.getView<TextView>(R.id.tv1)?.text = data.toString()
}
}
/**
* 代替viewholder
*/
inner class Delegate2 : ItemViewDelegate<String>(2, R.layout.item_2) {
//在有多种viewholder时,
//此方法的作用是判断此viewholder是否应该显示某数据类型的数据
Expand All @@ -143,16 +98,9 @@ xxxNeko<数据类型>(rv){
}
}
```

## 多种adapter用于recyclerview显示
1. 使用普通的adapter显示列表


```
/**
* 普通的adapter
* 普通的adapter,多种viewtype
*/
fun nekoTest() {
//预定义数据
Expand All @@ -162,8 +110,15 @@ xxxNeko<数据类型>(rv){
//两个viewholder类型
val item1 = Delegate1()
val item2 = Delegate2()
//泛型指定了此recyclerview显示什么类型的数据
val neko = neko<String>(rv) {
//内置默认LinearLayoutManager,可以在这里修改
//layoutManager=GridLayoutManager(this@MainActivity2,2) //替换默认的布局管理器
layoutManager.apply {
//修改布局管理器的配置
}
//在有多种viewholder时,根据数据类型返回不同的viewtype
//当不指定这个解析器时,就得重写ItemViewDelegate中的isForViewType方法来判断viewtype
viewTypeParser = ViewTypeParser<String> { data, pos ->
Expand All @@ -172,20 +127,14 @@ xxxNeko<数据类型>(rv){
mDatas = d.toMutableList()//指定adapter的数据。也可以现在不指定数据,在后面的show方法中传入数据
//1. 多种viewtype可以使用[addItemViews]将多种viewholder添加进去
//多种viewtype可以使用[addItemViews]将多种viewholder添加进去
addItemViews(item1, item2)
//2. 单一viewtype,使用[addItemView]方法添加viewholder
//这种单一viewholder, 用不上viewTypeParser
//注意: 不要与[addItemViews]混用
// addItemView(R.layout.item_3) { holder, t, position -> //数据绑定
// holder.getView<TextView>(R.id.tv2)?.text = t.toString()
// }
//给整个itemview设置点击事件
itemClickListener = ItemClickListener { view, holder, position ->
Toast.makeText(applicationContext, mDatas[position], Toast.LENGTH_LONG).show()
}
//设置长按事件
itemLongClickListener = ItemLongClickListener { view, holder, position ->
Toast.makeText(applicationContext, mDatas[position], Toast.LENGTH_LONG).show()
true
Expand All @@ -198,58 +147,76 @@ xxxNeko<数据类型>(rv){
(neko.iNekoAdapter as NekoAdapter).notifyItemChanged(1)
//刷新数据
neko.refreshData(d)
//刷新数据
neko.nekoAdapter.notifyItemChanged(3)
}
```
2. 使用listadapter显示列表
/**
* 仅有一种viewHolder的示例
*/
fun nekoSingleTest() {
//预定义数据
val d: MutableList<String> = mutableListOf()
d.addAll(listOf("a", "b", "c", "item"))
//泛型指定了此recyclerview显示什么类型的数据
val neko = neko<String>(rv) {
// .....
//仅有一种viewHolder,
//不需要指定viewTypeParser
//不需要重写ItemViewDelegate中的isForViewType方法来判断ViewType
//仅添加"viewholder"
addSingleItemView(R.layout.item_1) { holder, data, position ->
holder.getView<TextView>(R.id.tv1)?.text = data.toString()
}
// .....
}.show(d)//调用show方法完成recycleview的显示
}
```
/**
* listadapter
* listadapter,多种viewtype
*/
fun listNekoTest() {
val d: MutableList<String> = mutableListOf<String>()
val item1 = Delegate1()
val item2 = Delegate2()
val myDiffCallback = object : DiffUtil.ItemCallback<String>() {
//指定diffCallback
override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
TODO("Not yet implemented")
}
override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {
TODO("Not yet implemented")
}
}
val neko = listNeko<String>(
recyclerView = rv,
diffCallback = object : DiffUtil.ItemCallback<String>() { //指定diffCallback
override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
TODO("Not yet implemented")
}
override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {
TODO("Not yet implemented")
}
}) {
//根据数据类型返回不同的viewtype
viewTypeParser = ViewTypeParser<String> { data, pos ->
if (data == "item")
1
else
2
}
mDatas = d.toMutableList()//指定adapter的数据
addItemViews(item1, item2)
// 若没有指定[asyncConfig],则用[diffCallback]参数创建NekoListAdapter
// 若指定了[asyncConfig],则[diffCallback]参数不起作用
//diffCallback和asyncConfig是listAdapter的构造函数参数,不明白去看下ListAdapter
diffCallback = myDiffCallback,
asyncConfig = AsyncDifferConfig.Builder<String>(myDiffCallback).build()
) {
//这部分代码跟上面一样
}.show()
neko.mDatas[1] = "eee"
//刷新数据
neko.submitList(d)
//刷新数据
neko.nekoListAdapter.submitList(null)
}
```

3. 使用pagingDataAdapter显示列表
```
/**
* pagingDataAdapter
*/
fun pagingTest() {
paging3Neko(rv, object : DiffUtil.ItemCallback<String>() {
val pagingAdapter= paging3Neko(rv, object : DiffUtil.ItemCallback<String>() {
//这里指定了数据是否相同的判断。不明白的再去学一遍pagingDataAdapter。
override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
TODO("Not yet implemented")
}
Expand All @@ -258,15 +225,12 @@ xxxNeko<数据类型>(rv){
TODO("Not yet implemented")
}
}) {
//这里跟其他的几种情况一模一样,不再重复写
}
//刷新数据
pagingAdapter.nekoPagingAdapter.notifyItemChanged(3)
}
```

4. 使用concatAdapter显示列表

```
/**
* concatAdapter
*/
Expand All @@ -282,19 +246,27 @@ xxxNeko<数据类型>(rv){
val neko1 = neko<String>(rv) {
mDatas = d1.toMutableList()//指定adapter的数据
addItemView(R.layout.item_1) { holder, data, position ->
//仅有一种viewHolder
addSingleItemView(R.layout.item_1) { holder, data, position ->
holder.getView<TextView>(R.id.tv1)?.text = data.toString()
}
}
val neko2 = neko<String>(rv) {
mDatas = d2.toMutableList()//指定adapter的数据
addItemView(R.layout.item_2) { holder, data, position ->
//仅有一种viewHolder
addSingleItemView(R.layout.item_2) { holder, data, position ->
holder.getView<TextView>(R.id.tv2)?.text = data.toString()
}
}
concat(neko1, neko2) {
//将两个adapter合并,此方法可以传入更多的adapter进行合并
concatNeko(neko1, neko2) {
// todo 自定义配置
}
}.show()
//刷新数据
neko1.nekoAdapter.notifyItemChanged(2)
}
```
}
```
2 changes: 1 addition & 1 deletion RecyclerViewNeko/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ dependencies {
implementation(AndroidX.Core.core)
implementation(AndroidX.appCompat)
implementation(AndroidX.recyclerView)
implementation(AndroidX.paging3)
api(AndroidX.paging3)

testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.3")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ fun <T : Any> Context.neko(
/**
* 根据配置,生成NekoListAdapter
* 若没有指定[asyncConfig],则用[diffCallback]参数创建NekoListAdapter
* 若指定了[asyncConfig],则[diffCallback]参数不起作用
*/
fun <T : Any> Context.listNeko(
recyclerView: RecyclerView,
Expand Down Expand Up @@ -111,7 +112,6 @@ fun <T : Any, N : BaseConfig<T>> concatNeko(
): ConcatConfig<T, N> {
val c = ConcatConfig(configList = nekoConfigs)
c.config.configBlock()
c.done()
return c
}

Expand Down
Loading

0 comments on commit b5111a2

Please sign in to comment.