adapter为null_Kotlin扩展函数 + DSL 封装Adapter,是时候提高你撸RecycleView的效率了!...

点击上方“技术最TOP”,星标公众号

重磅干货,第一时间送达

175bd6757124508772938182183dc6a3.png

作者:L_Xian, 链接:https://juejin.im/post/5effe30e6fb9a07ea10bc869

前言

在项目开发中,总离不开列表,说到列表,就会有无穷无尽的 Adapter 需要你去实现。从而出现了很多优秀的 adapter 库。

不过很多库功能都很全面了,有很多个类,很多功能,但是实际上只用其中的一两个我感觉是很多人的现状。所以自己实现一个使用起来顺手的是一个不错的选择,特别是用在一些不是很复杂的列表时。

效果

先看看使用效果,激发一下你为数不多继续阅读的激情:

//单类型列表,默认 LinearLayoutManager
recycleView.setup {
    dataSource(initData())
    adapter {
        addItem(R.layout.layout_item) {
            bindViewHolder { data, _, _ ->
                setText(R.id.number, data?.number.toString())
            }
        }
    }
}//多类型列表
recycleView.setup {
    withLayoutManager { LinearLayoutManager(context) }
    dataSource(data)
    adapter {
        addItem(R.layout.item_setion_header) {
            isForViewType { data, _ -> data is SectionHeader }
            bindViewHolder { data, _, _ ->val header = data as SectionHeader
                setText(R.id.section_title, header.title)
            }
        }
        addItem(R.layout.item_user) {
            isForViewType { data, _ -> data is User }
            bindViewHolder { data, _, _ ->val user = data as User
                setText(R.id.name, user.name)
                setImageResource(R.id.avatar, user.avatarRes)//如果你的控件找不到方便赋值的方法,可以通过 findViewById 去查找val phone = findViewById(R.id.phone)
                phone.text = user.phone
            }
        }
    }
}

嗯....,感觉还可以,最少的情况下可以把一个列表代码用 10 几行就完成了。

完整代码地址

先贴完整代码地址,没地址的文章是没灵魂的:EfficientAdapter:https://github.com/EspoirX/EfficientAdapter , 我把它命名为 EfficientAdapter ,意为高效的意思,事实上它只有 3 个文件。 至于如何使用,在地址上已经描述了,所以这篇文章主要是讲一下实现的思路。35fd4de83591a173ebea1125bed733f9.gif

实现思路

对 Adapter 的封装,其实无非就是对 Adapter 里面的几个回调方法进行封装罢了,最常用的方法是先定义好一个存放 ViewHolder 的列表,然后在各个回调中获取这些 ViewHolder,然后实现逻辑。

那么其中最操蛋的是哪个回调方法的封装呢?我认为是 getItemViewType。事实上你可以在很多框架中看到让你实现获取 ViewType 的回调方法。

一步一步来,先说ViewHolder 的封装 在 EfficientAdapter 里面,我把 ViewHolder 的封装写成了 BaseViewHolder

class BaseViewHolder(parent: ViewGroup, resource: Int) : RecyclerView.ViewHolder(
        LayoutInflater.from(parent.context).inflate(resource, parent, false)
)

这就是我的封装,够简单吧。

想什么呢,当然没这么简单,想要在上面使用效果代码中那样实现 ViewHolder 的具体逻辑,还需要有 isForViewTypebindViewHolder 等方法。所以我要定义一个类,去提供这些方法&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值