如何使用 ViewModel Android Kotlin 将项目添加到 RecyclerView
How to add Items to RecyclerView using a ViewModel Android Kotlin
我有一个 fragment
,其中初始化了一个 RecyclerView
。在同一个 fragment
中,我向这个 RecyclerView
添加了元素。代码如下:
private lateinit var profileMenuList: MutableList<ProfileMenu>
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentProfileBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupRecyclerView()
}
private fun setupRecyclerView() {
profileMenuList = mutableListOf(
ProfileMenu(
title = "Favorite",
description = "What you liked",
icon = R.drawable.ic_outline_favorite_light
)
)
val adapter = ProfileAdapter(profileMenuList)
binding.rvProfileMenu.layoutManager = LinearLayoutManager(requireContext())
binding.rvProfileMenu.adapter = adapter
}
这也是 Adapter
:
的代码
class ProfileAdapter(private val profileMenuList: List<ProfileMenu>): RecyclerView.Adapter<ProfileAdapter.ViewHolder>() {
class ViewHolder(private val binding: ItemProfileMenuBinding): RecyclerView.ViewHolder(binding.root) {
fun bind(menu: ProfileMenu) = with(binding) {
tvTitle.text = menu.title
tvDescription.text = menu.description
Glide.with(itemView.context).load(menu.icon).into(ivIcon)
}
companion object {
fun from(parent: ViewGroup): ViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val binding = ItemProfileMenuBinding.inflate(layoutInflater, parent, false)
return ViewHolder(binding)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder.from(parent)
}
}
但我想将 fragment
中 setupRecyclerView()
函数的代码放入视图模型中。我该怎么做?
这不是你想要的好做法。 ViewModel 不与 UI 个元素交互。
正确使用;
您可以在 ViewModel 中创建 live-data 个对象。然后观察 UI 中的对象。没有将 recylerview 传递给 ViewModel。
你不应该更新 UI 或在视图模型中使用任何上下文,你必须通过 viewModel 中的 liveData 对象传递你的列表并在你的片段或 activity 中观察它,像这样:
class MyViewModel: ViewModel() {
val profileMenuList = MutableLiveData<List<ProfileMenu>>()
init {
profileMenuList .value = "YourDataRepository"
}
}
}
然后观察fragment中的liveData或者activity,阅读Android Documentation做
我有一个 fragment
,其中初始化了一个 RecyclerView
。在同一个 fragment
中,我向这个 RecyclerView
添加了元素。代码如下:
private lateinit var profileMenuList: MutableList<ProfileMenu>
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentProfileBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupRecyclerView()
}
private fun setupRecyclerView() {
profileMenuList = mutableListOf(
ProfileMenu(
title = "Favorite",
description = "What you liked",
icon = R.drawable.ic_outline_favorite_light
)
)
val adapter = ProfileAdapter(profileMenuList)
binding.rvProfileMenu.layoutManager = LinearLayoutManager(requireContext())
binding.rvProfileMenu.adapter = adapter
}
这也是 Adapter
:
class ProfileAdapter(private val profileMenuList: List<ProfileMenu>): RecyclerView.Adapter<ProfileAdapter.ViewHolder>() {
class ViewHolder(private val binding: ItemProfileMenuBinding): RecyclerView.ViewHolder(binding.root) {
fun bind(menu: ProfileMenu) = with(binding) {
tvTitle.text = menu.title
tvDescription.text = menu.description
Glide.with(itemView.context).load(menu.icon).into(ivIcon)
}
companion object {
fun from(parent: ViewGroup): ViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val binding = ItemProfileMenuBinding.inflate(layoutInflater, parent, false)
return ViewHolder(binding)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder.from(parent)
}
}
但我想将 fragment
中 setupRecyclerView()
函数的代码放入视图模型中。我该怎么做?
这不是你想要的好做法。 ViewModel 不与 UI 个元素交互。
正确使用; 您可以在 ViewModel 中创建 live-data 个对象。然后观察 UI 中的对象。没有将 recylerview 传递给 ViewModel。
你不应该更新 UI 或在视图模型中使用任何上下文,你必须通过 viewModel 中的 liveData 对象传递你的列表并在你的片段或 activity 中观察它,像这样:
class MyViewModel: ViewModel() {
val profileMenuList = MutableLiveData<List<ProfileMenu>>()
init {
profileMenuList .value = "YourDataRepository"
}
}
}
然后观察fragment中的liveData或者activity,阅读Android Documentation做