android - 使用数据绑定填充 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)
}
}
}
欢迎任何建议,谢谢。
解决方案
所以我想通了。基于此设置,我可以创建一个空的 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)保持不变。
推荐阅读
- c++ - 如何编辑文本文件的某些部分c ++?(苹果系统)
- node.js - 导出套接字 io 以在控制器中使用
- sql - 仅包含具有更新值的列的动态更新语句
- python-3.x - 让 pytest 查看我要测试的文件
- sqlalchemy - SQLAlchemy 尝试两次删除多对多辅助关系 PostgreSQL
- c++ - 调用 remove_if 的正确方法
- amazon-web-services - 直接从 Kubernetes/ALB Ingress 托管的 URL 中点击 Vue 客户端路由
- python-3.x - 为什么当 super() 具有多重继承时不能调用所有的 __init__?
- firebase - Streambuilder 是从 firestore 文档中获取所有数据还是仅从需要的字段中获取数据?
- python - 如何将文件直接下载到存档中?