Home > Net >  textchangedlistener and item of recycler view are not in sync, what can be the reason?
textchangedlistener and item of recycler view are not in sync, what can be the reason?

Time:02-10

My stock keeping aplication has items in recycler view which has edit texts and textviews, whenever i change value of edittext, whole item will be updated by getting data from API, But this is giving me some bugs. when i change second item s edittext, first item is updated, second item is never updated. here's my rcv adapter,

class RecyclerViewAdapterU (val dataList:ArrayList<ModelClass>): RecyclerView.Adapter<RecyclerViewAdapterU.ViewHolder>() {
    var _binding: UploadItemViewBinding? = null
    val binding get() = _binding!!


        override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): RecyclerViewAdapterU.ViewHolder {

        val v =
            LayoutInflater.from(parent.context).inflate(R.layout.upload_item_view, parent, false)
        _binding = UploadItemViewBinding.bind(v)
        return ViewHolder(binding.root)
    }

    fun getUpdatedDetails(skucode:String,pos:Int){
        val call: Call<List<ModelClass>>? =
            ApiClient.instance?.myApi?.getfromsku(skucode)!!
        call!!.enqueue(object : Callback<List<ModelClass>?> {
            override fun onResponse(
                call: Call<List<ModelClass>?>,
                response: Response<List<ModelClass>?>
            ) {
                val skuDetails=response.body()

                if (!skuDetails.isNullOrEmpty()) {
                    val x=dataList[pos].sku_code
                    for (i in skuDetails.indices){
                        println(skuDetails[i].sku_code)
                        println(".........$pos")
                        if (x!=skuDetails[i].sku_code){
                        dataList.removeAt(pos)
                        dataList.add(pos,skuDetails[i])
                        notifyItemChanged(pos)}
                    }
                }


            }

            override fun onFailure(call: Call<List<ModelClass>?>, t: Throwable) {
            }
        })
    }

    override fun onBindViewHolder(holder: ViewHolder, @SuppressLint("RecyclerView") position: Int) {


        bindItems(dataList[position])
        holder.getStock()
        holder.updateStockDetail()

    }
    fun bindItems(data: ModelClass) {

        binding.apply {
            itemquant.text=data.item_quant
            uploadItemName.text = data.item_name
            uploadMfg.text = data.mfg
            skuStock.setText(data.item_stock.toString())
             skuCode.setText(data.sku_code)
        }


    }



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


    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {


        fun getStock() {



            binding.skuStock.addTextChangedListener(object : TextWatcher {
                override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
                override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
                override fun afterTextChanged(editable: Editable) {
                    if (binding.skuStock.isFocused){
                    for (i in 0 until RecyclerViewAdapter.ob.dataSelected.size){
                        if (editable.toString().trim()!=""){
                            var x= editable.toString().trim().toInt()

                            RecyclerViewAdapter.ob.dataSelected[adapterPosition].item_stock=x
                            //getting current itemstock before pushing update.
                            //assigning latest itemstock to the data for the update
                        }
                    }
                }}

            })
        }

        fun updateStockDetail(){
            binding.skuCode.addTextChangedListener(object : TextWatcher{
                override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {}
                override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {
                }
                override fun afterTextChanged(editable: Editable) {
                    binding.skuCode.removeTextChangedListener(this)
                    var pos:Int=adapterPosition
                    var x= editable.toString().trim()


                    //RecyclerViewAdapter.ob.dataSelected[adapterPosition].sku_code=x
                    println("$x in textwatcher")

                    //getting edited text and calling the function to get updated details.

                    getUpdatedDetails(x,pos)
                   binding.skuCode.addTextChangedListener(this)

                }
            })

        }

    }
}

note:ob.dataselected is coming from another recyclerview adapter. Function i am talking about is updatestockdetail()

CodePudding user response:

  •  Tags:  
  • Related