Google又更新了:实战-MergeAdapter

我简单给你解释下,以前我们要写一个列表,比如有三部分组成:

头部卡片+内容卡片+尾部卡片

正常我们会考虑多 itemtype 实现。

但是现在出来了一个新的技术方案。

你可以使用 3 个 Adapter 实现,例如 HeaderAdapter+ContentAdapter+FootAdapter,merge 到一块成为一个 MergeAdapter,设置给 RecyclerView。

有什么好处呢?

恩…看下文吧。

我们先来看下面的 RecyclerView 应该如何实现?

源码地址见文末。

实现起来其实很简单,利用现有的知识,大部分人都能想到用多类型的 itemView 。

这里要区分三种类型,Teacher ,Student 和 Foot 。

不同的类型要对应不同的布局文件,同样也对应不同的业务逻辑。长久以来我们一直都是这么做的。

那么,你有没有想过这么做有什么不合理的地方吗?

耦合度过高 。

上面的示例中一个 Adapter 需要负责三套视图布局的呈现,如果是四套,五套,甚至更多呢?从 扩展性 上来说,这个方案也不尽合理。

既然如此,那就让每个 Adapter 只负责一套视图布局。

既降低了代码耦合度,又便于扩展。

如果出现了新的布局类型,再来一个 Adapter 就行了。

上面的示例中一共需要三个 Adapter,TeahcherAdapter,StudentAdapter,FootAdapter 。

  • TeahcherAdapter 负责展示列表最上面 Teacher 部分的视图。

  • StudentAdapter 负责展示列表主体 Student 部分的视图。

  • FootAdapter 负责展示列表底部加载状态的视图,包含加载中和无更多数据。

看起来很美好,各司其职,互不干扰。

然而问题是,你的 RecyclerView 可以接受几个 Adapter ?

public void setAdapter(@Nullable Adapter adapter) {
// bail out if layout is frozen
setLayoutFrozen(false);
setAdapterInternal(adapter, false, true);
processDataSetCompletelyChanged(false);
requestLayout();
}

RecyclerView 显然是 “一夫一妻制” 。通过 setAdapter() 方法,我们只能给 RecyclerView 设置一个 Adapter 。

在 recyclerview:1.2.0-alpha02 中,其实我们仍然只能设置一个 Adapter ,但是这个 Adapter 可以是 MergeAdapter ,一个可以做加法的 Adapter 。

直接上代码。

private val teacherAdapter by lazy { TeacherAdapter() }
private val studentAdapter by lazy { StudentAdapter() }
private val stateAdapter by lazy { StateAdapter() }

val mergeAdater = MergeAdapter(teacherAdapter, studentAdapter, footAdapter)

recyclerView.adapter = mergeAdapter

使用方法就是如此的朴实无华,甚至有那么一点枯燥。MergeAdapter 构造函数中的参数顺序,就标识了列表中数据的显示顺序。

第一块布局是 Teacher 。

在实际开发中,常常可以用作 Header View 。

class TeacherAdapter : ListAdapter<Teacher, TeacherViewHolder>(TeacherDiffCallback()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TeacherViewHolder {
return TeacherViewHolder(
ItemTeacherBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
}

override fun onBindViewHolder(holder: TeacherViewHolder, position: Int) {
holder.bind(getItem(position))
}

}

第二块布局是 Student 。也就是实际开发中的真正的列表数据。

class StudentAdapter : ListAdapter<Student, StudentViewHolder>(StudentDiffCallBack()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StudentViewHolder {
return StudentViewHolder(
ItemStudentBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
}

override fun onBindViewHolder(holder: StudentViewHolder, position: Int) {
holder.bind(getItem(position))
}
}

最后一块布局是状态布局,也就是通常的 Footer 。包含正在加载,加载失败和无更多数据,三种状态。

class FootAdapter : ListAdapter<LoadState, StateViewHolder>(StateDiffCallBack()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StateViewHolder {
return StateViewHolder(
ItemStateBinding.inflate(
LayoutInflater.from(parent.context),
parent,

最后,如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。

小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值