Редактирование текста и текстового обзора внутри утилиты просмотра

Это код Котлина, где у меня есть корзина заказов, которая состоит из ArrayList элементов и что я пытаюсь сделать здесь, это то, что по умолчанию будет установлено значение 1 в EditText и у меня есть кнопки для увеличения и уменьшения. Поэтому всякий раз, когда я пытаюсь увеличить или уменьшить значение с помощью этих кнопок, общая сумма для TextView в каждом ряду должны быть изменены. Однако теперь все работает нормально, как всякий раз, когда я увеличиваю или уменьшаю значение TextView Общая сумма изменяется в строке, но когда я прокручиваю вниз или вверх значение в TextView исчезает и возвращается к значению по умолчанию.

internal class KartListAdapter(private var arrayList: List<Kartdata>,
                           private val context: Context,
                           var presenter: MainContract.Presenter,
                           var recyclerview: RecyclerView,grandtotalTv:TextView) : RecyclerView.Adapter<KartListAdapter.MainHolder>() {

    var list=arrayList

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.kart_newrow, parent, false)
        return MainHolder(v)
    }

    override fun onBindViewHolder(holder: MainHolder, position: Int) {

        holder.bindItem(arrayList[position])
        holder.itemsqty.tag = position
        holder.perpriceprice.tag=position

        var qtyval:Int = holder.itemsqty.text.toString().toInt()
        var perqtyPrice = arrayList[position].qtyPrice

        holder.btnIncrease.setOnClickListener() {
            qtyval++
            holder.itemsqty.text=qtyval.toString()
        }

        holder.btnDecrease.setOnClickListener() {
            qtyval--
            holder.itemsqty.text=qtyval.toString()
        }

        holder.itemsqty.addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(s: Editable) {
               // Toast.makeText(context,"after text change"+s.toString(),Toast.LENGTH_LONG).show()
            }

            override fun beforeTextChanged(s: CharSequence, start: Int,
                                           count: Int, after: Int) {
                //Toast.makeText(context,"before text change"+s.toString(),Toast.LENGTH_LONG).show()
            }

            override fun onTextChanged(s: CharSequence, start: Int,
                                       before: Int, count: Int) {
                if(s.toString().trim()!="") {
                    if (s.toString().toInt()<1) {
                        val perpiecetotal=qtyval*perqtyPrice
                        holder.itemsqty.text="1"
                        holder.perpriceprice.text="OMR:"+perpiecetotal.toString()

                    } else {
                        val perpiecetotal=qtyval*perqtyPrice
                        Log.i("pricing-qtyval",qtyval.toString())
                        Log.i("pricing-perqtyprice",perqtyPrice.toString())
                        holder.perpriceprice.text="OMR:"+perpiecetotal.toString()
                        Log.i("pricing-grandtotalprice",perpiecetotal.toString())
                        holder.perpriceprice.tag=position
                    }
                    //Toast.makeText(context,"on text change"+s.toString(),Toast.LENGTH_LONG).show()
                } else {
                    Toast.makeText(context,"somewhere qty is empty",Toast.LENGTH_LONG).show()

                }
            }
        })
    }

    override fun getItemViewType(position: Int): Int {
        return position
    }

    override fun getItemCount(): Int {
        return arrayList.size
    }

    internal inner class MainHolder(view: View) : RecyclerView.ViewHolder(view) {

        var menuname = itemView.findViewById<TextView>(R.id.cateegory_tv)
        var qtyname = itemView.findViewById<TextView>(R.id.qty_name)
        var qtyprice = itemView.findViewById<TextView>(R.id.qty_price)
        var perpriceprice = itemView.findViewById<TextView>(R.id.price_calculated_tv_item)
        var itemsqty = itemView.findViewById<TextView>(R.id.no_of_items_edt)
        var deleteicon = itemView.findViewById<ImageView>(R.id.delete_icon)
        var btnIncrease = itemView.findViewById<ImageView>(R.id.btn_increase)
        var btnDecrease = itemView.findViewById<ImageView>(R.id.btn_decrease)

        fun bindItem(kart: Kartdata) {
            menuname.setText(kart.MenuName)
            qtyname.setText(kart.qtyName)
            qtyprice.setText("OMR\t"+kart.qtyPrice)
            val perpiecetotal=1*kart.qtyPrice
            perpriceprice.text="OMR:"+perpiecetotal.toString()

            deleteicon.setOnClickListener() {
                val database = KartDatabase.getInstance(context)
                val repository = KartRepository(AppExecutors(), database.dapendukDAO())
                Toast.makeText(context,"deleted",Toast.LENGTH_SHORT).show()
                presenter.deleteitem(repository,kart.id)
                presenter.getlistsize(repository)
                (context as FragmentActivity).supportFragmentManager.beginTransaction()
                        .disallowAddToBackStack()
                        .replace(R.id.container, KartFragment.newInstance(), KartFragment.TAG)
                        .commit()
            }
        }
    }
}

1 ответ

Решение

Вам нужно иметь массив величин в KartListAdapter чтобы сохранить количество. Значения исчезают, а показ неверный, потому что представления перерабатываются в RecyclerView, Таким образом, вам нужно сохранить данные каждой строки в отдельном ArrayList, а затем показать их количество.

Поэтому я хотел бы предложить иметь отдельный ArrayList в вашем KartListAdapter лайк var quantityList: List<Int>,

Затем, когда количество увеличивается или уменьшается, значение в quantityList, Инициализируйте этот ArrayList с нулями и размер равен arrayList перешел на адаптер.

Теперь в вашем bindView функция, установите текст в текстовом поле количества, как это.

holder.itemsqty.text = quantityList[position];

И инсайдер onBindViewHolder, пока вы обновляете количества, просто увеличивайте и уменьшайте значения в quantityList а затем позвоните notifyDataSetChanged внести изменения, необходимые в вашем RecyclerView,

holder.btnIncrease.setOnClickListener() {
    quantityList[position] = quantityList[position] + 1;
    notifyDataSetChanged();
}

holder.btnDecrease.setOnClickListener() {
    if(quantityList[position] > 0) { 
        quantityList[position] = quantityList[position] - 1;
        notifyDataSetChanged();
    }
}

Код не проверен и может не работать из-за синтаксических ошибок. Тем не менее, я думаю, что у вас есть идея сохранить количества, увеличенные или уменьшенные в отдельном списке, и заполнить представления оттуда в вашем RecyclerView,

Надеюсь, это поможет!

Другие вопросы по тегам