gpt4 book ai didi

安卓喷气背包 : RecyclerView is not updating when LiveData is set

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:06 25 4
gpt4 key购买 nike

所以我有一个简单的实现来在 RecyclerView 中显示用户列表,并在 ViewModel 中查询该列表作为 LiveData .

问题是 UI 未更新以显示最新列表 - 称为 users - 即使观察到列表也是如此。我现在只是设置了一个演示用户列表。

这是我的 View 模型:

class MainViewModel : ViewModel() {

private val demoData = listOf(
User(userName = "Bob", favoriteColor = "Green"),
User(userName = "Jim", favoriteColor = "Red"),
User(userName = "Park", favoriteColor = "Blue"),
User(userName = "Tom", favoriteColor = "Yellow"),
User(userName = "Lee", favoriteColor = "Black"),
User(userName = "Xiu", favoriteColor = "Gray")
)

private val _users = MutableLiveData<List<User>>()
val users: LiveData<List<User>>
get() = _users

init {
_users.value = listOf()
}

fun loadUsers() {
_users.value = demoData.toMutableList().apply { shuffle() }
}
}

还有我的 ViewModel 的附加 fragment :

// ...

override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)

viewModel.users.observe(this, Observer {
mAdapter.notifyDataSetChanged()
})

mAdapter = UsersAdapter(viewModel.users.value!!)

mainRV = view?.findViewById<RecyclerView>(R.id.rv_main)?.apply {
adapter = mAdapter
layoutManager = LinearLayoutManager(view?.context)
}

viewModel.loadUsers()
}

附言UsersAdapter 是一个普通的 RecyclerView.Adapter

我已经确保在我的用户列表中调用 setValue 来调用 Observer,因此我不确定这里缺少什么。我的适配器设置错误吗?

最佳答案

fun loadUsers() {
_users.value = demoData.toMutableList().apply { shuffle() }
}

toMutableList() 用数据创建一个新列表,查看源代码:

public fun <T> Collection<T>.toMutableList(): MutableList<T> {
return ArrayList(this)
}

因此,与其获取初始值并且从不更新适配器,不如更新适配器中的列表并显示它。

viewModel.users.observe(this, Observer { users ->
mAdapter.updateData(users)
})

如果你不在哪里 using ListAdapter , 然后你可以像这样定义这个方法:

class MyAdapter: RecyclerView.Adapter<ViewHolder>(
private var list: List<User> = Collections.emptyList()
) {
...

fun updateData(users: List<User>) {
this.users = users
notifyDataSetChanged()
}
}

您还可以使用 ListAdapter and submitList你还会得到动画。

关于安卓喷气背包 : RecyclerView is not updating when LiveData is set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50779740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com