【问题标题】:Is there any way to use multiple LayoutManagers with MergeAdapter in a RecyclerView?有没有办法在 RecyclerView 中使用多个 LayoutManagers 和 MergeAdapter?
【发布时间】:2020-06-26 00:13:59
【问题描述】:

我正在使用 MergeAdapter (A.K.A ConcatAdapter)

https://medium.com/androiddevelopers/merge-adapters-sequentially-with-mergeadapter-294d2942127a

但我需要做的是第一个适配器应该显示一个网格布局,第二个适配器应该显示一个线性布局,所以,如果我这样做

 val headerAdapter = HeaderAdapter(requireContext(), Header("TestHeader"))
        val dividerViewAdapter = DividerViewAdapter(requireContext())
        val animalAdapter = DividerViewAdapter(requireContext(),DataSource.animalList) // -> this should be shown as a GridLayout
        val mergeAdapter = MergeAdapter(headerAdapter,dividerViewAdapter,animalAdapter)
        test_rv.layoutManager = LinearLayoutManager(requireContext())
        test_rv.adapter = mergeAdapter

现在这段代码工作正常,但由于它有一个线性布局管理器,所有内容都将显示为一个线性布局,我的animalAdapter 不会按我想要的方式显示。

有没有为不同的适配器设置不同的布局管理器以我想要的方式显示数据?

【问题讨论】:

    标签: android android-fragments kotlin android-recyclerview android-adapter


    【解决方案1】:

    其实我是这样解决的:

        class HorizontalContainerAdapter(private val lifecycleOwner: LifecycleOwner, val adapter : ListAdapter<*, *>) :
    ListAdapter<String, HorizontalContainerAdapter.Holder>(diffCallback) {
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        val inflater = LayoutInflater.from(parent.context)
        return Holder(DataBindingUtil.inflate(inflater, R.layout.item_horizontal_container, parent, false), adapter)
    }
    
    override fun onBindViewHolder(holder: Holder, position: Int) {
        holder.binding.lifecycleOwner = lifecycleOwner
    }
    
    override fun getItemViewType(position: Int): Int {
        return R.layout.item_horizontal_container
    }
    
    override fun getItemCount(): Int {
         return 1
    }
    
    class Holder(val binding: ItemHorizontalContainerBinding, adapter: ListAdapter<*, *>) : RecyclerView.ViewHolder(binding.root) {
    
        init {
            binding.recyclerView.layoutManager = LinearLayoutManager(binding.recyclerView.context, LinearLayoutManager.HORIZONTAL, false)
            binding.recyclerView.adapter = adapter
        }
    }
    
    companion object {
        val diffCallback by lazy {
            object :
                DiffUtil.ItemCallback<String>() {
    
                override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
                    return oldItem == newItem
                }
    
                override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {
                    return oldItem == newItem
                }
            }
        }
    }
    

    Mergeadapter / ConcatAdapter with Horizontal and Vertical Layouts

    祝你好运

    【讨论】:

      【解决方案2】:

      不,没有办法让多个LayoutManagers 与一个RecyclerView 关联。 LayoutManager 用于整个RecyclerView,与Adapter 无关。换句话说:适配器没有布局管理器;而RecyclerView 有一个布局管理器,它还有一个适配器。

      如果不是这种情况,行为会变得非常奇怪,例如,如果它从一行中间的 GridLayoutManager 切换到 LinearLayoutManager

      对于您的特定场景,线性布局中的行(对于垂直列表)或列(对于水平列表)与跨度计数等于跨度数的网格中的项目相同,因此您如果您正确设置跨度计数,则可以简单地为整个RecyclerView 使用GridLayoutManager

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-25
        • 1970-01-01
        • 2021-03-14
        • 1970-01-01
        相关资源
        最近更新 更多