我有一个使用GridLayoutManager的Recyclerview,如上面。
初始化时,它有一些空项目(如占位符)。
当我按下按钮时,将图像上传到我的服务器并将其绑定以在成功后进行查看。
另一方面,当我按下一个上载的图像时,调用delete API并将其从视图中删除并同时添加一个新的空项目。
我面临的问题是,即使数据已更新,当我添加新项目时它也不会更新视图。
似乎新添加的项目使用已删除项目的视图。 (背景颜色,点击侦听器等)
当我使用notifyDataSetChanged
时成功。
我的方法在下面
fun deleteItem(pictureId: Int) {
val position = mItems.indexOfFirst {
if (it is PictureItem) {
it.userImage?.imageId == pictureId
} else {
false
}
}
mItems.removeAt(position)
mItems.add(PictureItem())
notifyItemRemoved(position)
notifyItemInserted(itemCount - 1)
notifyItemRangeChanged(position, itemCount)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val item = mItems[holder.adapterPosition]
when (item) {
is PictureItem -> (holder as? PictureViewHolder)!!.bind(item)
~~~
}
}
private class PictureViewHolder(private val context: Context, view: View,
private val clickListener: PictureClickListener) : RecyclerView.ViewHolder(view) {
private val mImageView: ImageView = view.findViewById(id)
private val mOverlayText: TextView = view.findViewById(id)
fun bind(item: PictureItem) {
if (item.userImage == null) {
mImageView.setImageResource(colorres)
return
}
bindSubPictureUrl(context, item.userImage!!)
mImageView.setOnClickListener {
clickListener.clicked(imageId))
}
}
private fun bindSubPictureUrl(context: Context, userImage: UserImage) {
Glide.~~~.into(mImageView)
mOverlayText.visibility = if (someCondition) View.VISIBLE else View.GONE
}
}
答案 0 :(得分:0)
在您的onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)
中,您拥有position
参数。
您在
adapterPosition
中使用的val item = mItems[holder.adapterPosition]
您不应该在这里使用position
吗?