Android 如何使用LiveData在ListItemView中显示名称而不是id?

Android 如何使用LiveData在ListItemView中显示名称而不是id?,android,kotlin,android-livedata,Android,Kotlin,Android Livedata,我是一个科特林新手,似乎我陷入了最简单的情况。我试图使用正确的架构,但无法理解以下内容。我为我儿子创建了一个简单的学校时间表应用程序。有一个教师班和一个学科班。两者都是房间数据库中的数据类。该科目有一个教师id。我有一个包含科目列表的RecyclerView。这个想法是在一张科目卡片上显示老师的名字。但我不明白如何获取并显示教师的姓名,而不是主题。教师id使用最佳/正确的实践 SubjectsViewModel片段: class SubjectsViewModel( val databa

我是一个科特林新手,似乎我陷入了最简单的情况。我试图使用正确的架构,但无法理解以下内容。我为我儿子创建了一个简单的学校时间表应用程序。有一个教师班和一个学科班。两者都是房间数据库中的数据类。该科目有一个教师id。我有一个包含科目列表的RecyclerView。这个想法是在一张科目卡片上显示老师的名字。但我不明白如何获取并显示教师的姓名,而不是主题。教师id使用最佳/正确的实践

SubjectsViewModel片段:

class SubjectsViewModel(
    val database: SchoolScheduleDao,
    application: Application
) : AndroidViewModel(application) {

    val db = database

...

    val subjects_list = db.getAllSubjects()
    val teachers_list = db.getAllTeachers()

...

    fun getTeacherFromList(teacher_id: Long): String {

        var tName:String = ""
        var lTeacher: Teacher? = teachers_list.value?.find { it.teacherId == teacher_id }

        if (lTeacher != null){
            tName = lTeacher.firstName + " " + lTeacher.secondName + " " + lTeacher.thirdName
        }

        return tName
    }

    ...
}

class  SubjectsAdapter(val clickListener: SubjectsListener): ListAdapter<Subject, SubjectsAdapter.ViewHolder>(SubjectsDiffCallback()) {

    class ViewHolder private constructor (val binding: ListItemSubjectBinding) : RecyclerView.ViewHolder(binding.root){

        companion object {
            fun from(parent: ViewGroup): ViewHolder {
                val layoutInflater = LayoutInflater.from(parent.context)
                val binding =
                    ListItemSubjectBinding.inflate(layoutInflater, parent, false)
                return ViewHolder(binding)
            }
        }

        fun bind(item: Subject, clickListener: SubjectsListener) {

            binding.subject = item

            val res = binding.root.context.resources

            binding.subjectName.text = item.name
            binding.roomNumber.text = item.roomNumber
            binding.teacherOfSubject.text = /*??? how to get Teacher.Name from here? I suppose if I use my SubjectsViewModel.getTeacherFromList(subject.teacher_id) here it is not a good practice*/

            binding.clickListener = clickListener
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder.from(parent)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {

        holder.bind(getItem(position)!!, clickListener)

    }

}

...

class SubjectsListener(val clickListener: (ts: Subject) -> Unit) {

    fun onClick(subject: Subject) = clickListener(subject)

}
受试者捕获片段:

class SubjectsViewModel(
    val database: SchoolScheduleDao,
    application: Application
) : AndroidViewModel(application) {

    val db = database

...

    val subjects_list = db.getAllSubjects()
    val teachers_list = db.getAllTeachers()

...

    fun getTeacherFromList(teacher_id: Long): String {

        var tName:String = ""
        var lTeacher: Teacher? = teachers_list.value?.find { it.teacherId == teacher_id }

        if (lTeacher != null){
            tName = lTeacher.firstName + " " + lTeacher.secondName + " " + lTeacher.thirdName
        }

        return tName
    }

    ...
}

class  SubjectsAdapter(val clickListener: SubjectsListener): ListAdapter<Subject, SubjectsAdapter.ViewHolder>(SubjectsDiffCallback()) {

    class ViewHolder private constructor (val binding: ListItemSubjectBinding) : RecyclerView.ViewHolder(binding.root){

        companion object {
            fun from(parent: ViewGroup): ViewHolder {
                val layoutInflater = LayoutInflater.from(parent.context)
                val binding =
                    ListItemSubjectBinding.inflate(layoutInflater, parent, false)
                return ViewHolder(binding)
            }
        }

        fun bind(item: Subject, clickListener: SubjectsListener) {

            binding.subject = item

            val res = binding.root.context.resources

            binding.subjectName.text = item.name
            binding.roomNumber.text = item.roomNumber
            binding.teacherOfSubject.text = /*??? how to get Teacher.Name from here? I suppose if I use my SubjectsViewModel.getTeacherFromList(subject.teacher_id) here it is not a good practice*/

            binding.clickListener = clickListener
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder.from(parent)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {

        holder.bind(getItem(position)!!, clickListener)

    }

}

...

class SubjectsListener(val clickListener: (ts: Subject) -> Unit) {

    fun onClick(subject: Subject) = clickListener(subject)

}
class SubjectsAdapter(val clickListener:SubjectsListener):ListAdapter(SubjectsDiffCallback()){
类ViewHolder私有构造函数(val绑定:ListItemSubjectBinding):RecyclerView.ViewHolder(binding.root){
伴星{
乐趣来自(父:视图组):视图持有者{
val layoutInflater=layoutInflater.from(parent.context)
缬氨酸结合=
ListItemSubjectBinding.inflate(LayoutFlater、parent、false)
返回视图保持器(绑定)
}
}
趣味绑定(项目:主题,点击监听器:主题监听器){
binding.subject=项目
val res=binding.root.context.resources
binding.subjectName.text=item.name
binding.roomNumber.text=item.roomNumber
binding.teacherOfSubject.text=/*?如何从这里获取Teacher.Name?我想如果我在这里使用我的SubjectsViewModel.getTeacherFromList(subject.Teacher\u id),这不是一个好的做法*/
binding.clickListener=clickListener
}
}
override onCreateViewHolder(父级:ViewGroup,viewType:Int):ViewHolder{
返回ViewHolder.from(父级)
}
覆盖BindViewHolder(holder:ViewHolder,位置:Int){
holder.bind(getItem(位置)!!,单击Listener)
}
}
...
类SubjectsListener(val clickListener:(ts:Subject)->Unit){
趣味点击(主题:主题)=点击监听器(主题)
}

请给我一个正确的方向

这应该有助于你将科目与老师联系起来。我认为这里的要点是,您需要向适配器传递一个对象,该对象包含您需要在UI中显示的所有信息。因此,在你的案例中,你需要将老师的名字添加到学生班级中。谢谢大家。我刚刚发现了一个房间的“定义对象之间的关系”指南,似乎这正是我的情况——定义一个内部有关系的复合对象。这将有助于你将科目与教师联系起来。我认为这里的要点是,您需要向适配器传递一个对象,该对象包含您需要在UI中显示的所有信息。因此,在你的案例中,你需要将老师的名字添加到学生班级中。谢谢大家。我刚刚发现了一个房间的“定义对象之间的关系”指南,似乎这正是我的情况——定义一个内部有关系的复合对象。