Как показать имя вместо идентификатора в ListItemView с LiveData? - PullRequest
1 голос
/ 13 января 2020

Я Kotlin новичок ie и кажется, что застрял в простейшем случае. Я пытаюсь использовать правильную архитектуру, но не могу понять следующее. Я создаю простое приложение школьного расписания для моего сына. Существует класс учителя и предметный класс. Оба являются классами данных в базе данных комнаты. У субъекта есть 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)

}

Пожалуйста, подскажите мне правильное направление

...