Повторяющиеся данные в 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

}

Ответы (0 шт):