Android Jetpack:设置LiveData时,RecyclerView未更新

Android Jetpack:设置LiveData时,RecyclerView未更新,android,android-recyclerview,kotlin,android-jetpack,android-livedata,Android,Android Recyclerview,Kotlin,Android Jetpack,Android Livedata,因此,我有一个简单的实现,可以在RecyclerView中显示用户列表,并在ViewModel中查询该列表 问题在于,用户界面没有更新以显示最新的列表(称为用户),即使在观察列表时也是如此。我刚刚建立了一个演示用户列表 以下是我的ViewModel: class MainViewModel : ViewModel() { private val demoData = listOf( User(userName = "Bob", favoriteColor = "

因此,我有一个简单的实现,可以在
RecyclerView
中显示用户列表,并在
ViewModel
中查询该列表

问题在于,用户界面没有更新以显示最新的列表(称为
用户
),即使在观察列表时也是如此。我刚刚建立了一个演示用户列表

以下是我的ViewModel:

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() }
    }
}
class MainViewModel:ViewModel(){
private val demoData=listOf(
用户(userName=“Bob”,favoriteColor=“绿色”),
用户(userName=“Jim”,favoriteColor=“Red”),
用户(userName=“Park”,favoriteColor=“Blue”),
用户(userName=“Tom”,favoriteColor=“黄色”),
用户(userName=“Lee”,favoriteColor=“Black”),
用户(userName=“Xiu”,favoriteColor=“Gray”)
)
private val_users=MutableLiveData()
val用户:LiveData
get()=\u用户
初始化{
_users.value=listOf()
}
有趣的用户(){
_users.value=demoData.toMutableList().apply{shuffle()}
}
}
以及我的ViewModel的附加片段:

// ...

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()
}
/。。。
覆盖活动创建的乐趣(savedInstanceState:Bundle?){
super.onActivityCreated(savedInstanceState)
viewModel=ViewModelProviders.of(this.get)(MainViewModel::class.java)
viewModel.users.observe(这个,观察者{
mAdapter.notifyDataSetChanged()
})
mAdapter=UsersAdapter(viewModel.users.value!!)
mainRV=视图?findViewById(R.id.rv\U main)?应用{
适配器=mAdapter
layoutManager=LinearLayoutManager(视图?.context)
}
viewModel.loadUsers()
}
另外,
UsersAdapter
是一个常见的
RecyclerView.Adapter

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

fun loadUsers() {
    _users.value = demoData.toMutableList().apply { shuffle() }
}
toMutableList()
使用数据创建一个新列表,请参阅源代码:

public fun <T> Collection<T>.toMutableList(): MutableList<T> {
    return ArrayList(this)
}
如果不是,则可以这样定义此方法:

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

    fun updateData(users: List<User>) {
        this.users = users
        notifyDataSetChanged()
    }
}
类MyAdapter:RecyclerView.Adapter(
private-var-list:list=Collections.emptyList()
) {
...
fun updateData(用户:列表){
this.users=用户
notifyDataSetChanged()
}
}

您还可以使用并获得动画。

至少可以查看适配器的“绑定”部分。另外,您不需要调用apply{},您可以直接调用shuffle()。通常情况下,新列表会在观察者回调中传递给适配器,因为该列表不会在适当的位置发生变化。您
getValue
第一个值就是它。您应该在
observe
方法中将新列表设置为适配器。
class MyAdapter: RecyclerView.Adapter<ViewHolder>(
   private var list: List<User> = Collections.emptyList()
) {
    ...

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