如何使用 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)
    }
}

但我想将 fragmentsetupRecyclerView() 函数的代码放入视图模型中。我该怎么做?

这不是你想要的好做法。 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