Android 如何使用LiveData在ListItemView中显示名称而不是id?
我是一个科特林新手,似乎我陷入了最简单的情况。我试图使用正确的架构,但无法理解以下内容。我为我儿子创建了一个简单的学校时间表应用程序。有一个教师班和一个学科班。两者都是房间数据库中的数据类。该科目有一个教师id。我有一个包含科目列表的RecyclerView。这个想法是在一张科目卡片上显示老师的名字。但我不明白如何获取并显示教师的姓名,而不是主题。教师id使用最佳/正确的实践 SubjectsViewModel片段:Android 如何使用LiveData在ListItemView中显示名称而不是id?,android,kotlin,android-livedata,Android,Kotlin,Android Livedata,我是一个科特林新手,似乎我陷入了最简单的情况。我试图使用正确的架构,但无法理解以下内容。我为我儿子创建了一个简单的学校时间表应用程序。有一个教师班和一个学科班。两者都是房间数据库中的数据类。该科目有一个教师id。我有一个包含科目列表的RecyclerView。这个想法是在一张科目卡片上显示老师的名字。但我不明白如何获取并显示教师的姓名,而不是主题。教师id使用最佳/正确的实践 SubjectsViewModel片段: class SubjectsViewModel( val databa
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中显示的所有信息。因此,在你的案例中,你需要将老师的名字添加到学生班级中。谢谢大家。我刚刚发现了一个房间的“定义对象之间的关系”指南,似乎这正是我的情况——定义一个内部有关系的复合对象。