Удаленный элемент из адаптера не переименован - PullRequest
0 голосов
/ 20 марта 2020

Я делаю приложение, которое добавляет в корзину кучу предметов, теперь у меня есть этот пользовательский интерфейс, который добавляет элемент кнопкой + и удаляет его из массива, если я нажимаю кнопку -, когда 1 находится на количество.

У меня есть массив элементов (ПУНКТ А, ПУНКТ B), я могу добавить количество к этим элементам, поэтому я создал второй массив, в котором хранится имя элемента, количество элемента и элемент цена, я делаю это, чтобы получить базовую c корзину с выбранными предметами.

Таким образом, когда я нажимаю кнопку +, количество увеличивается на моем элементе A, так же, как на элементе B, это работает правильно , но теперь, когда я нажимаю кнопку минус - и количество равно 1, я удаляю этот элемент из массива selecteditem, поэтому теперь у меня есть элемент b с количеством 3, но поскольку я удалил элемент a из этого массива, теперь элемент B находится в позиции 0, это означает, что когда я нажимаю элемент A, чтобы обновить его значение, он будет обновлять значение элемента B, а элемент A будет создан в позиции 2, где находится элемент b, поэтому при обновлении элемента бит будет обновляться вещь A и это продолжается

enter image description here

. Этот код я использую для обновления значений элемента

Адаптер

var productList = mutableListOf<Product>()
 var cartProductList = mutableListOf<ProductCartSelected>()


 inner class StoreViewHolder(itemView: View): BaseViewHolder<Product>(itemView){
        override fun bind(item: Product,position: Int) {
            //First button click before select quantity
            itemView.btn_action_add.setOnClickListener {
                itemView.btn_action_add.visibility = View.GONE
                itemView.card_selector_product.visibility = View.VISIBLE
                itemClickListener?.onCartClick(item)
            }

            itemView.btn_increase.setOnClickListener {
                val currentQuantity = itemView.txt_quantity.text.toString().toInt()
                if(currentQuantity != 20){
                    val quantity = currentQuantity + 1
                    display(quantity)
                    updateProductQuantity(position,quantity)
                }
            }

            itemView.btn_decrease.setOnClickListener {
                val currentQuantity = itemView.txt_quantity.text.toString().toInt()
                if(currentQuantity == 1){
                    removeSelectedProduct(position)
                }else{
                    val quantity = currentQuantity - 1
                    display(quantity)
                    updateProductQuantity(position,quantity)
                }
            }

        }

  fun setItems(selectedProductList: MutableList<Producto>) {
        productList = selectedProductList
        notifyDataSetChanged()
    }

    fun setProductSelected(productCartSelected: ProductCartSelected){
        cartProductList.add(productCartSelected)
    }

    fun removeSelectedProduct(position: Int){
        cartProductList.removeAt(position)
        notifyDataSetChanged()
    }

    fun updateProductQuantity(position: Int,quantity:Int){
        cartProductList[position].quantity = quantity
        itemClickListener?.onUpdatedProductQuantity(cartProductList[position])
    }

Итак, в основном проблема заключается в том, что я использую removeSelectedProduct(position), поскольку он удалит продукт из cartProductList, но сохранит ссылки на индексы productlist, поэтому при обновлении количества по любому другому элементу все индексы меняются, и обновление неправильно

На мой взгляд, я отправил элемент a и элемент B с помощью setItems() метода

Классы данных

@Parcelize
data class Product(
    val name:String = "", val price:Int = 0,val productImage:String = "",val hasDiscount:Boolean = false
) : Parcelable

data class ProductCartSelected(var quantity:Int,var productName: String,var price: Int)

Если требуется какая-либо другая информация, просто спросите мне

спасибо

1 Ответ

1 голос
/ 20 марта 2020

Я программирую на java, но у меня была такая же проблема. Я предлагаю вам создать единый список, который вы используете, чтобы заполнить свое мнение о переработчике. вместо того, чтобы просто передавать имя продукта вашему классу ProductCartSelected, почему бы не передать ему сам продукт? и просто для примера я бы дал ему идентификатор.

, так как вы будете использовать только один список, это должно решить вашу проблему, поскольку позиции в вашем обзоре переработчиков и ваш список ProductCartSelected должны оставаться в синхронизации c.

В качестве альтернативы создайте метод, который использует что-то вроде идентификатора, который я предложил, чтобы проверить правильность положения изменяемых элементов, прежде чем изменять их. но я бы сначала попробовал это с предыдущим подходом

создать метод, который просматривает список объектов ProductCartSelected и возвращает один объект, который вы на самом деле модифицируете, давайте вызовем этот метод fun ProductCartSelected findCartObject(cartId: Int) (как я сказал, к сожалению, я не говорите kotlin) в вашем OnBindViewHolder вместо передачи позиции таким методам, как updateProductQuantity, вы передадите ему cartID (или, альтернативно, productName) и внутренне этот метод будет использовать метод findCartObject для возврата нужного объекта, который на самом деле должен быть изменен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...