notifyDataSetChanged () не обновляет интерфейс - PullRequest
0 голосов
/ 10 ноября 2019

Я хочу отобразить новый список элементов, полученных из ViewModel в пользовательском RecyclerView.Adapter. Для этого я передаю полученный список адаптеру и вызываю notifyDataSetChanged(), но в интерфейсе ничего не меняется.

Я отладил код, и в списке адаптера было 1 элемент (пользовательский интерфейс отображал 1 элемент), в новом извлеченном списке было 2 элемента - после установки нового списка в адаптере и вызова notifyDataSetChanged() пользовательский интерфейс не изменился, но должендобавьте 1 элемент.

Код фрагмента:

trip_details_participantsList.layoutManager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false)
trip_details_participantsList.adapter = userBriefAdapter

tripsDetailsViewModel.getTripParticipants(tripId).observe(this, Observer {participants ->
   tripsDetailsViewModel.getUsersBriefs(participants.map { x -> x.userId }).observe(this, Observer{ users ->
       userBriefAdapter.setData(users)
   })
})

Пользовательский адаптер и ViewHolder:

class UserBriefAdapter : RecyclerView.Adapter<UserBriefViewHolder>() {
   private var users: List<UserBrief> = mutableListOf()

   fun setData(items: List<UserBrief>){
      this.users = items
      notifyDataSetChanged()
   }

   override fun onBindViewHolder(holder: UserBriefViewHolder, position: Int) = 
      holder.bind(users[position])

   override fun getItemCount() = users.size

   override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserBriefViewHolder {
      val inflater = LayoutInflater.from(parent.context)
      return UserBriefViewHolder(inflater, parent)
   }
}

class UserBriefViewHolder(inflater: LayoutInflater, parent: ViewGroup) : RecyclerView.ViewHolder(inflater.inflate(
   R.layout.trip_details_list_item, parent, false)) {

   private var profilePictureImageView: ImageView = itemView.findViewById(R.id.trips_details_profile_image)

   fun bind(userBrief: UserBrief){
      Picasso.get()
        .load(userBrief.profilePictureUrl)
        .into(profilePictureImageView)
    }
}

Я уже читал существующие темы по этому поводу, но каждое принятое решениеэто что-то вроде функции setData() моего адаптера с notifyDataSetChanged(). Я также пытался установить новый экземпляр UserBriefAdapter в RecyclerView каждый раз, когда наблюдаемые значения менялись, но результаты были одинаковыми. Когда я перехожу назад и вперед, тогда он правильно отображает элементы, но я хочу достичь этого, не меняя представление.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Закончили еще одну отладку и выяснили, что notifyDataSetChanged() не проблема. Я неправильно передал profilePictureUrl на UserBriefViewHolder, поэтому библиотека Пикассо не получает изображение и, как следствие, пользовательский интерфейс не обновлялся.

0 голосов
/ 10 ноября 2019

Это может быть проблема с многопоточностью. Попробуйте опубликовать исполняемый файл в главной ветке в обратном вызове обозревателя:

 tripsDetailsViewModel.getUsersBriefs(participants.map { x -> x.userId }).observe(this, Observer{ users ->
     view?.post { userBriefAdapter.setData(users) }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...