Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android notifyDataSetChanged()未更新UI_Android_Kotlin_Android Recyclerview_Android Livedata - Fatal编程技术网

Android notifyDataSetChanged()未更新UI

Android notifyDataSetChanged()未更新UI,android,kotlin,android-recyclerview,android-livedata,Android,Kotlin,Android Recyclerview,Android Livedata,我想在custom RecyclerView.Adapter中显示从ViewModel检索到的项目的新列表。为此,我将检索到的列表传递给适配器并调用notifyDataSetChanged(),但UI上没有任何更改 我调试了代码,适配器的列表有1个元素(UI显示了1个元素),新检索到的列表有2个元素-在适配器中设置了新列表并调用notifyDataSetChanged()UI没有更改,但应该附加这1个元素 片段代码: trip_details_participantsList.layoutMan

我想在custom 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)
    }
}
class UserBriefAdapter:RecyclerView.Adapter(){
私有var用户:List=mutableListOf()
乐趣设置数据(项目:列表){
this.users=项目
notifyDataSetChanged()
}
覆盖onBindViewHolder(holder:UserBriefViewHolder,位置:Int)=
holder.bind(用户[位置])
重写getItemCount()=users.size
重写CreateViewHolder(父级:ViewGroup,viewType:Int):UserBriefViewHolder{
val inflater=LayoutInflater.from(parent.context)
return UserBriefViewHolder(充气机,父级)
}
}
类UserBriefViewHolder(充气器:LayoutFlater,父级:ViewGroup):RecyclerView.ViewHolder(充气器.充气器)(
R.layout.trip_详细信息_列表_项目,父项,false)){
私有变量profilePictureImageView:ImageView=itemView.findViewById(R.id.trips\u details\u profile\u image)
趣味绑定(userBrief:userBrief){
毕加索
.load(userBrief.profilePictureUrl)
.into(profilePictureImageView)
}
}

我已经阅读了关于它的现有主题,但每个公认的解决方案都类似于我的适配器的
setData()
函数,带有
notifydatasetchange()
。我还尝试在每次观察到的值更改时将UserBriefAdapter的新实例设置为RecyclerView,但结果是一样的。当我来回查看视图时,它会正确显示元素,但我希望在不更改视图的情况下实现这一点。

这可能是线程问题。尝试在observer回调中向主线程发布runnable:

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

进行了更多的调试,发现问题不在于
notifyDataSetChanged()
。我将错误的
profilePictureUrl
传递给
UserBriefViewHolder
,因此毕加索库无法获取图像,因此UI没有更新。

不幸的是,这也不起作用。在我的问题中,我编辑了Fragment的代码,因为我真正做的是每次
参与者
改变时调用
tripsDetailsViewModel.getUsersBriefs
。我不知道这是否改变了什么。