Дизайн
У меня есть 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
}
}