【发布时间】: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