Android Jetpack: RecyclerView не обновляется, когда установлена ​​LiveData - PullRequest
0 голосов
/ 10 июня 2018

Итак, у меня есть простая реализация для отображения списка пользователей в RecyclerView, а список запрашивается в ViewModel как LiveData.

Проблема заключается в том, что пользовательский интерфейс не обновляется, чтобы отображать последний список, называемый users, даже когда список наблюдается.Я только что настроил список демонстрационных пользователей.

Вот мой 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() }
    }
}

И прикрепленный фрагмент моего 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()
}

PS the UsersAdapter это обычный RecyclerView.Adapter.

Я убедился, что позвонил setValue в своем списке пользователей, чтобы вызвать Обозревателя, поэтому я не уверен, чего здесь не хватает.Мой адаптер неправильно настроен?

1 Ответ

0 голосов
/ 10 июня 2018
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)
})

Где, если вы не используете ListAdapter, вы можете определить этот метод следующим образом:

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

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

Вытакже можно использовать ListAdapter и submitList, и вы также получите анимацию.

...