RecyclerView не обновляет представления после notifyItemInserted - PullRequest
0 голосов
/ 28 июня 2018

Дизайн

У меня есть Recyclerview с использованием GridLayoutManager, как указано выше.
При инициализации он содержит несколько пустых элементов (например, заполнитель).
Когда я нажимаю кнопку, загрузите изображение на свой сервер и привяжите его для просмотра после успеха.
С другой стороны, когда я нажимаю загруженное изображение, вызываю 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 голосов
/ 28 июня 2018

В вашем onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) есть аргумент position.
Что такое adapterPosition, что вы используете в
val item = mItems[holder.adapterPosition]

Разве вы не должны использовать position там?

...