Повторяющиеся данные в recyclerView
Попытался реализовать нажатие кнопки на каждом item в recyclerView. Сами данные загружаются нормально, не повторяются, подгрузка при прокрутке работает правильно. Но при нажатии на кнопку Сохранить, переодически выводятся одинаковые номера позиций. В чем проблема может быть?

class MainActivity : AppCompatActivity() {
lateinit var bind: ActivityMainBinding
private var adapter: ImageAdapter = ImageAdapter()
lateinit var disposable: Disposable
var order = "popular"
var query = ""
var page = 1
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
bind = DataBindingUtil.setContentView(this, R.layout.activity_main)
setSupportActionBar(bind.toolbar)
adapter.setOnEndListener(object : ImageAdapter.OnReachEndListener {
override fun onReachEnd() {
bind.progressBarHor.visibility = View.VISIBLE
loadData(query, order, page)
}
})
adapter.setSaveButtonListener(object : ImageAdapter.OnSaveButtonListener {
override fun onSave(image: Image, position: Int) {
Toast.makeText(this@MainActivity, "click position $position : id = ${image.id}", Toast.LENGTH_LONG).show()
}
})
bind.swipeRefreshLayout.setOnRefreshListener {
page = 1
loadData(query, order, page)
}
loadData(query, order, page)
}
fun loadData(q: String, order: String, page: Int) {
disposable = RetrofitClient.getClient("https://pixabay.com/api/")
.create(RetrofitService::class.java)
.getImagesNew(q, order, page)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ imagesResponse ->
if (page <= 1)
showData(imagesResponse.images as MutableList<Image>)
else
showLoadedData(imagesResponse.images as MutableList<Image>)
},
{ throwable -> showError(throwable.message) }
)
}
private fun showData(list: MutableList<Image>) {
adapter.setList(list)
adapter.notifyDataSetChanged()
bind.recycler.adapter = adapter
bind.recycler.smoothScrollToPosition(0)
page++
bind.progressBar.visibility = View.GONE
bind.swipeRefreshLayout.isRefreshing = false
Toast.makeText(this, "order: $order", Toast.LENGTH_LONG).show()
}
private fun showLoadedData(list: MutableList<Image>) {
adapter.updateList(list)
adapter.notifyDataSetChanged()
page++
bind.progressBarHor.visibility = View.GONE
}
}
Код адаптера
class ImageAdapter(private var list: MutableList<Image> = mutableListOf()) : RecyclerView.Adapter<ImageAdapter.ImageViewHolder>() {
fun setList(l: MutableList<Image>) {
list = l
notifyDataSetChanged()
}
fun updateList(l: MutableList<Image>) {
list.addAll(l)
notifyDataSetChanged()
}
lateinit var onReachEndListener: OnReachEndListener
fun setOnEndListener(listener: OnReachEndListener) { onReachEndListener = listener }
interface OnReachEndListener { fun onReachEnd() }
lateinit var onSaveButtonListener: OnSaveButtonListener
fun setSaveButtonListener(listener: OnSaveButtonListener) { onSaveButtonListener = listener }
interface OnSaveButtonListener { fun onSave(image: Image, position: Int) }
lateinit var view: ItemPostBinding
inner class ImageViewHolder(private val binding: ItemPostBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(image: Image) {
binding.apply {
tvUserName.text = image.user
tvLike.text = image.likes.toString()
tvFavorite.text = image.collections.toString()
tvDownloads.text = root.resources.getString(R.string.downloads, image.downloads)
tvSize.text = root.resources.getString(R.string.size, image.imageWidth, image.imageHeight)
tvWeight.text = root.resources.getString(R.string.weight, byteTo(image.imageSize))
if (image.userImageURL.isNotEmpty())
Glide.with(binding.root)
.load(image.userImageURL)
.fitCenter()
.into(ivUserPhoto)
if (image.webformatURL.isNotEmpty())
Glide.with(binding.root)
.load(image.webformatURL)
.thumbnail(Glide.with(binding.root).load(R.drawable.loader))
.fitCenter()
.into(ivImage)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageViewHolder {
view = ItemPostBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ImageViewHolder(view)
}
override fun onBindViewHolder(holder: ImageViewHolder, position: Int) {
holder.bind(list[position])
if (list.size >= 10 && position == list.size - 3)
onReachEndListener.onReachEnd()
view.btnSave.setOnClickListener {
onSaveButtonListener.onSave(list[position], position)
}
}
override fun getItemCount() = list.size
}