RecyclerView 不考虑Type情况下如何实现万能布局

RecyclerView 到底如何适配多种布局?

我看到问的最多的一个问题是,「RecyclerView 一个适配器如何适配多种布局」。

老实说,这个问题,我第一反应就是网上被人都写烂了的万能适配器,所以回答的就是根据不同的 Type 去设置 ViewHolder,毕竟我们通常设置 RecyclerView 的 Header 和 Footer 就是通过这样的方式来实现的。但这样的方式有一个非常严重的问题,就是其实根本就不万能,当我们遇到各种 Item 布局的时候,我们又得重新维护 ViewHolder,一旦这个布局方式多了起来,就会存在严重的维护问题。

那我们还能有怎样的思路来处理呢?

实际上,我们大多数,甚至是所有页面都可以用 RecyclerView 来实现,只是每一项的 Item 显示方式不一样而已。为了减少维护成本,我们显然不应该把判断是哪种 Type 的代码放在 RecyclerView 的「万能」适配器中。而应该把这个逻辑抽象成一个接口,然后让子类去自由发挥。然后在外面调用的时候,我们就只需要根据 model 的数据进行不一样的布局填充就可以了。

你可能会有点晕,其实我自己也一样,原谅我现在是从早上 7 点半一直干到现在的人,但我还是希望你能多看几遍。

好吧,看了好几遍了,还是一脸懵逼,姑且点到为止吧,时间关系,后面再做详细阐述。

作者的原话抄袭地址为:https://www.jianshu.com/p/1975f88d5139
 

接下来我来实现代码咯

首先定义一个接口MultipleType

package com.example.krcm110.myapplication.com.view.recyclerview

interface MultipleType<T> {
    fun getLayoutId(item: T, position: Int): Int
}

 然后定义一个父类CommonAdapter: RecyclerView.Adapter<CommonHolder>()关键是要重写getItemViewType方法

 //多态布局实现
override fun getItemViewType(position: Int): Int {
    return mTypeSupport?.getLayoutId(mData[position], position) ?: super.getItemViewType(position)
}
这样一个万能的Adapter就实现了,你只需要在运动的地方实现MultipleType接口就可以了。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值