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接口就可以了。