【问题标题】:notifyDataSetChanged() not updating UInotifyDataSetChanged() 不更新 UI
【发布时间】:2019-11-10 16:03:48
【问题描述】:

我想在自定义 RecyclerView.Adapter 中显示从 ViewModel 检索到的新项目列表。为此,我将检索到的列表传递给适配器并调用 notifyDataSetChanged(),但 UI 上没有任何变化。

我已经调试了代码并且适配器的列表有 1 个元素(UI 显示了 1 个元素),新检索到的列表有 2 个元素 - 在适配器中设置新列表并调用 notifyDataSetChanged() 后 UI 没有改变,但应该附加那个 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,但结果是相同的。当我来回查看视图时,它会正确显示元素,但我想在不更改视图的情况下实现这一点。

【问题讨论】:

    标签: android kotlin android-recyclerview android-livedata


    【解决方案1】:

    这可能是线程问题。尝试在观察者回调中向主线程发布一个可运行的:

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

    【讨论】:

    • 不幸的是,这也不起作用。我在我的问题中编辑了 Fragment 的代码,因为我真正做的是每次 participants 更改时调用 tripsDetailsViewModel.getUsersBriefs。我不知道这是否会改变什么。
    【解决方案2】:

    做了更多的调试,发现notifyDataSetChanged() 不是问题所在。我将错误的 profilePictureUrl 传递给 UserBriefViewHolder,所以 Picasso 库没有获取图像,因此 UI 没有更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多