【发布时间】:2019-07-03 18:01:28
【问题描述】:
我有一个父对象的集合,每个父对象都有一个子对象的集合。请致电ParentModels 和 ChildModels。
我想在屏幕上显示渲染的 ParentModel 的 RecyclerView,每个都包含渲染的 ChildModel 的 RecyclerView。
希望避免一个神 LiveData 仅仅因为一个 ChildModel 的一个属性发生变化而重绘所有内容,我打算将它们分开。
我不知道如何使用 Recyclerview 适配器和持有者以及我需要的任何 Fragment 和 ViewModel 来构建它。现在我有
class MyFragment: Fragment() {
private lateinit val mViewModel: FragmentViewModel
// ...
fun onViewCreated(/*...*/) {
val parentAdapter = ParentAdapter()
view.findViewById<RecyclerView>(/*...*/).apply {
adapter = parentAdapter
//...
}
viewModel.getParents().observe(this, Observer {
parentAdapter.setParents(it)
}
}
}
class FragmentViewModel @Inject constructor(repository: RoomRepo): ViewModel() {
mParents: LiveData<List<ParentModel>> = repository.getParents()
fun getParents() = mParents
//...
}
class ParentAdapter: RecyclerView.Adapter<ParentHolder>() {
private lateinit var mParents: List<ParentModel>
fun setParents(list: List<ParentModel>) {
mParents = list
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, /*...*/) {
return ParentHolder(LayoutInflater.from(parent.context).inflate(R.layout.parent, parent, false))
}
override fun onBindViewHolder(holder: ParentHolder, position: Int) {
holder.bind(/*UNKNOWN*/)
}
// ...
inner class ParentHolder(private val mView: View): RecyclerView.ViewHolder(mView) {
fun bind(/*UNKNOWN*/) {
// WHAT TO DO HERE???
}
}
}
加上我的R.layout.parent(我省略了其他不相关的东西,比如只绘制一条水平线的视图,但这就是我将 RecyclerView 嵌套在 LinearLayout 中的原因):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
android:layout_height="wrap_content"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
我不假思索地写了一个 ChildAdapter、ChildHolder 和其他一些东西,因为我认为这将是微不足道的实现,但在这一点上,我脑子里有些东西,我可能看不到明显的东西。
我已经根据基础数据正确加载了第一个 RecyclerView。但是这个父recyclerview也需要:
- 根据单个 parent.id 获取子项
- 为显示子级的单个父级 recyclerview 项创建子级 recyclerview
Room 从函数 repository.getChildrenByParentId(id: Long) 返回一个 LiveData>。这就是我正在使用的数据。
但是我在哪里获取这个,我如何将它挂钩到属于父 recyclerview 的相关子 recyclerview?
我不想有一个上帝片段 viewModel.getParents().observe(...) { parentAdapter.update(it) } 和 also 必须做某种 viewModel.getChildren().observe(...) { parentAdapter.更新儿童(它)}
因为这会破坏关注点分离。在我看来,父 recyclerview 中的每个项目都应该有一个 viewmodel 来获取属于它的孩子,然后创建一个 recyclerview 并使用 ChildAdapter 来显示这些孩子,但我似乎无法弄清楚在哪里插入ChildFragment 和 ChildViewModel(其中包含 repository.getChildrenByParentId)让这一切正常工作。
我在网上找到的所有示例似乎都没有帮助,因为他们使用了没有 LiveData 的人为示例以及将所有内容放在单个适配器中的上帝片段/活动。
【问题讨论】:
标签: android kotlin android-recyclerview android-livedata