首页 > 解决方案 > 如何使用 LiveData 在 ListItemView 中显示名称而不是 id?

问题描述

我是 Kotlin 新手,似乎我陷入了最简单的情况。我尝试使用正确的架构,但无法理解以下内容。我为儿子创建了一个简单的学校时间表应用程序。有教师班和学科班。两者都是房间数据库中的数据类。主题有一个teacher_id。我有一个带有主题列表的 RecyclerView。这个想法是在主题卡中显示老师的名字。但我无法理解如何使用最佳/正确做法获取和显示教师姓名而不是 subject.teacher_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
    }

    ...
}

SubjectsAdapter 片段:

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)

}

请提示我正确的方向

标签: androidkotlinandroid-livedata

解决方案


推荐阅读