再次打开片段后,recyclerview 项目的位置发生变化

position of recyclerview item changes after opening the fragment again

我正在使用 android 科特林。我正在开发在线购物应用程序。
在购物车部分。万事俱备 fine.adding 要购物车的商品或删除商品或添加数量并撤消删除。
当我单击撤消按钮时,撤消已删除的项目后,该项目将放置在自己的位置。但是当我关闭片段并再次打开它时,所有项目的位置都会改变,我首先点击的项目将是第一个项目,所以到最后

这是我的回收适配器:

class BasketRecyclerAdapter(val list: MutableList<Model.BasketItem>, val listener: ButtonListener) :
  RecyclerView.Adapter<BasketRecyclerAdapter.ViewHolder>() {

lateinit var context: Context

lateinit var localStore: LocalStore // i saved user phone and pass in a shared prefs using this class

inner class ViewHolder(val binding: BasketItemLayoutBinding) :
    RecyclerView.ViewHolder(binding.root) {

}

override fun onCreateViewHolder(
    parent: ViewGroup,
    viewType: Int
): BasketRecyclerAdapter.ViewHolder {
    val binding: BasketItemLayoutBinding = DataBindingUtil.inflate(
        LayoutInflater.from(parent.context),
        R.layout.basket_item_layout,
        parent,
        false
    )
    localStore = LocalStore(parent.context)

    context = parent.context
    return ViewHolder(binding)
}

override fun onBindViewHolder(holder: BasketRecyclerAdapter.ViewHolder, position: Int) {
    val currentItem = list[position]

    holder.binding.apply {
      
        title.text = currentItem.title
        numberPicker.progress = currentItem.quantity
        color.setCardBackgroundColor(android.graphics.Color.parseColor(currentItem.color))
        colorName.text = currentItem.color_name
        price.text =
            doubleToStringNoDecimal((currentItem.price * currentItem.quantity).toDouble())
        Glide.with(context)
            .asBitmap()
            .load(currentItem.url)
            .into(productImage)

        holder.binding.apply {
            numberPicker.doOnProgressChanged { numberPicker, progress, formUser ->
                listener.onPickerProgressChanged(
                    numberPicker,
                    progress,
                    formUser,
                    position
                )
                price.text =
                    doubleToStringNoDecimal((currentItem.price * progress).toDouble())
            }


            delete.setOnClickListener {
                listener.delete(holder.adapterPosition)
                removeItem(holder.adapterPosition, holder)

            }
        }
    }


}

override fun getItemCount(): Int = list.size


fun doubleToStringNoDecimal(d: Double): String? {
    val formatter: DecimalFormat = NumberFormat.getInstance(Locale.US) as DecimalFormat
    formatter.applyPattern("#,###,###,###")
    return formatter.format(d)
}


fun removeItem(position: Int, viewHolder: RecyclerView.ViewHolder) {
    val removedItem = list[position]
    val removedPosition = position

    list.removeAt(position)
    notifyItemRemoved(position)
    val snackbar = Snackbar.make(
        viewHolder.itemView,
        "این کالا از سبد خرید حذف شد",
        Snackbar.LENGTH_LONG
    )
    snackbar.setAction("بازگرداندن") {
        list.add(removedPosition, removedItem)
        notifyItemInserted(removedPosition)
        listener.SnackActionClicked(position)
    }
    snackbar.setActionTextColor(Color.YELLOW);
    snackbar.show();
}

interface ButtonListener {
    fun onPickerProgressChanged(
        numberPicker: NumberPicker,
        progress: Int,
        fromUser: Boolean,
        position: Int
    )

    fun delete(position: Int)
    fun SnackActionClicked(position: Int)
}

}

 adapter =
                    BasketRecyclerAdapter(
                        items as ArrayList<Model.BasketItem>,
                        object : BasketRecyclerAdapter.ButtonListener {
                            override fun onPickerProgressChanged(
                                numberPicker: NumberPicker,
                                progress: Int,
                                fromUser: Boolean,
                                position: Int
                            ) {
                                val currentitem = items[position]
                                viewModel.AddToCart(
                                    localStore.getMobile().toString(),
                                    currentitem.category,
                                    currentitem.title,
                                    currentitem.url,
                                    currentitem.price,
                                    progress,
                                    currentitem.color,
                                    currentitem.color_name,
                                    currentitem.product_id
                                )
                                updateWorkerData(
                                    currentitem.title,
                                    currentitem.color,
                                    Model.BasketItem::quantity,
                                    progress
                                )

                                viewModel.CalculateTotalPrice(items)
                                    .observe(viewLifecycleOwner) {
                                        binding.price.text = doubleToStringNoDecimal(it)
                                    }
                            }

                            override fun delete(position: Int) {
                                val currentitem = items[position]

                                viewModel.DeleteItemInCart(
                                    localStore.getMobile().toString(),
                                    currentitem.title,
                                    currentitem.color_name
                                )
                                itemList.remove(
                                    Model.BasketItem(
                                        currentitem.id,
                                        localStore.getMobile().toString(),
                                        currentitem.category,
                                        currentitem.title,
                                        currentitem.url,
                                        currentitem.price,
                                        currentitem.quantity,
                                        currentitem.color,
                                        currentitem.color_name,
                                        currentitem.product_id
                                    )
                                )

                                if (items.size == 1)
                                    if (isLastVisible()) {
                                        basketpic.visibility = View.VISIBLE
                                        emptyBasketText.visibility = View.VISIBLE
                                    } else {
                                        basketpic.visibility = View.GONE
                                        emptyBasketText.visibility = View.GONE
                                    }

                                viewModel.CalculateTotalPrice(items)
                                    .observe(viewLifecycleOwner) {
                                        binding.price.text = doubleToStringNoDecimal(it)
                                    }
                            }

                            override fun SnackActionClicked(position: Int) {
                                val currentitem = items[position]
                                viewModel.AddToCart(
                                    localStore.getMobile().toString(),
                                    currentitem.category,
                                    currentitem.title,
                                    currentitem.url,
                                    currentitem.price,
                                    currentitem.quantity,
                                    currentitem.color,
                                    currentitem.color_name,
                                    currentitem.product_id
                                )
                                binding.apply {
                                    basketpic.visibility = View.GONE
                                    emptyBasketText.visibility = View.GONE
                                }
                                viewModel.CalculateTotalPrice(items)
                                    .observe(viewLifecycleOwner) {
                                        binding.price.text = doubleToStringNoDecimal(it)
                                    }
                            }
                        }) 

任何帮助将不胜感激

更新

你可以看到第一个是白色的,第二个是棕色的,但是当我删除并取消删除棕色然后是白色并重新打开片段时,它们的位置发生了变化-> 看第二张图片

删除和撤消删除项目(先是棕色然后是白色)并重新打开片段后

问题是,当我点击 删除 按钮时, Mysql 中的相应行被删除,当我点击 撤消 按钮我删除的项目 已添加到具有新 ID 的 table,因此在片段重新打开后项目的位置发生了变化
所以我设置了一个 Snackbar.Callback 到 snackbar 我说当它自己关闭时你可以从数据库中删除该项目(mysql)
这是代码:

 val snackbar = Snackbar.make(
        viewHolder.itemView,
        "این کالا از سبد خرید حذف شد",
        Snackbar.LENGTH_LONG
    )
    snackbar.setAction("بازگرداندن") {
        list.add(removedPosition, removedItem)

        listener.SnackActionClicked(position)
        notifyItemInserted(removedPosition)
    }
    snackbar.setActionTextColor(Color.YELLOW);


    snackbar.addCallback(object : Snackbar.Callback() {
        override fun onDismissed(snackbar: Snackbar?, event: Int) {
            super.onDismissed(snackbar, event)
            if (event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT) {
                // Snackbar closed on its own

                // Delete item from mysql database
            }
        }

        override fun onShown(snackbar: Snackbar?) {
            super.onShown(snackbar)
        }
    });
    snackbar.show();