在notifyItemInserted之后,RecyclerView不会更新视图

时间:2018-06-28 13:05:51

标签: android android-recyclerview kotlin android-adapter

Design

我有一个使用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
    }

}

1 个答案:

答案 0 :(得分:0)

在您的onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)中,您拥有position参数。
您在
adapterPosition中使用的val item = mItems[holder.adapterPosition]

您不应该在这里使用position吗?