首页 > 解决方案 > 使用数据绑定填充 RecyclerView 内的 MultiView ViewHolder

问题描述

所以我能够接近创建 MultiView ViewHolder 的点,但我仍然对一些细节感到有些困惑。首先我将如何填写 RecyclerView,因为我有多个数据类(在这种情况下,手动)。其次,适配器如何知道何时显示特定视图?我将代码留在这里

数据类

sealed class InfoRecyclerViewItems{

    class WithPicture (
        val id: Int,
        val movieName: String,
        val thoughts: String
            ): InfoRecyclerViewItems()

    class WithoutPicture(
        val id: Int,
        val movieName: String,
        val thoughts: String
    ): InfoRecyclerViewItems()

}

适配器

class RecyclerViewAdapter(infoItems: MutableList<InfoRecyclerViewItems>): RecyclerView.Adapter<MainViewHolder>() {
    private var infoItems1: MutableList<InfoRecyclerViewItems>

    init {
        this.infoItems1 = infoItems
    }


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainViewHolder {
        return when(viewType){
           R.layout.container_one -> MainViewHolder.WithPictureViewHolder(
               ContainerOneBinding.inflate(
                   LayoutInflater.from(parent.context), parent, false)
           )

           R.layout.container_two -> MainViewHolder.WithoutPictureViewHolder(
               ContainerTwoBinding.inflate(
                   LayoutInflater.from(parent.context), parent, false)
           )
            else -> throw IllegalArgumentException("Invalid view given")
        }
    }

    override fun onBindViewHolder(holder: MainViewHolder, position: Int) {
        when(holder){
            is MainViewHolder.WithPictureViewHolder -> holder.bind(infoItems1[position] as InfoRecyclerViewItems.WithPicture)
            is MainViewHolder.WithoutPictureViewHolder -> holder.bind(infoItems1[position] as InfoRecyclerViewItems.WithoutPicture)
        }
    }

    override fun getItemCount() = infoItems1.size

    override fun getItemViewType(position: Int): Int {
        return when(infoItems1[position]){
            is InfoRecyclerViewItems.WithPicture -> R.layout.container_one
            is InfoRecyclerViewItems.WithoutPicture -> R.layout.container_two
        }
    }

}

视图持有者

sealed class MainViewHolder(binding: ViewBinding) : RecyclerView.ViewHolder(binding.root) {

    class WithPictureViewHolder(private val binding: ContainerOneBinding) : MainViewHolder(binding){
        fun bind(items: InfoRecyclerViewItems.WithPicture){
            binding.part1 = items
            binding.executePendingBindings()
        }
    }

    class WithoutPictureViewHolder(private val binding: ContainerTwoBinding) : MainViewHolder(binding){
        fun bind(items: InfoRecyclerViewItems.WithoutPicture){
            binding.part2 = items
            binding.executePendingBindings()
        }
    }

}

主要活动

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)



        binding.recyclerView.apply {
            setHasFixedSize(true)
            layoutManager = LinearLayoutManager(this@MainActivity)
        }
    }
}

欢迎任何建议,谢谢。

标签: androidkotlinandroid-layoutandroid-recyclerviewandroid-databinding

解决方案


所以我想通了。基于此设置,我可以创建一个空的 MutableList,然后调用我要填充的每个不同的数据类。这些数据类链接到与其关联的 ViewHolder,从而在 RecylerView 中创建两个不同的视图。

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private lateinit var manager: LinearLayoutManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val information: MutableList<InfoRecyclerViewItems> = ArrayList()
        information.add(InfoRecyclerViewItems.WithPicture(2, "The Fallen", "ok"))
        information.add(InfoRecyclerViewItems.WithoutPicture(4, "Black Panther", "10/10, Fantastic Movie"))

        manager = LinearLayoutManager(this)

       binding.recyclerView.apply {
           adapter = RecyclerViewAdapter(information)
           layoutManager = manager
       }

    }
}

然后,您可以继续添加到您选择将其添加到的任何视图

PS 其他文件(ViewHolder、Adapter 和 Data Class)保持不变。


推荐阅读