【问题标题】:How to update recyclerview element and retrieve sum all updated elements如何更新 recyclerview 元素并检索所有更新元素的总和
【发布时间】:2021-03-04 06:32:38
【问题描述】:

更新recyclerview的值但无法更新模型类中的对应数据

模型类

 @Parcelize
class GetStockListData : ArrayList<GetStockListDataItem>(), Parcelable
@Parcelize
data class GetStockListDataItem(
    var Qty:@RawValue Double,
    var selectedQty: Double
): Parcelable

可以如下使用 alertbox 更改 recyclerview 元素

 private fun showAlertDialog(stockListData: GetStockListData, position: Int) {
    val layoutInflater = LayoutInflater.from(context)
    val customView =
        layoutInflater.inflate(R.layout.change_qty_dialog, null)
    val myBox: android.app.AlertDialog.Builder = android.app.AlertDialog.Builder(context)
    myBox.setView(customView)

    val dialog = myBox.create()
    dialog.show()

    val etQuantity = customView.findViewById<AppCompatEditText>(R.id.et_quantity)
    if (stockListData[position].Qty < args.getListDetailsByRNumberModelItem.ReqQty) {
        val df = DecimalFormat("#.##")
        df.roundingMode = RoundingMode.CEILING
        etQuantity.setText(df.format(stockListData[position].Qty).toString())
    } else
        etQuantity.setText(args.getListDetailsByRNumberModelItem.ReqQty.toString())


    etQuantity.setSelection(etQuantity.text.toString().length)
    etQuantity.requestFocus()
    requireContext().showKeyboard()

    customView.findViewById<Button>(R.id.btnDone).setOnClickListener {
        if(!etQuantity.text.isNullOrEmpty()) {
            val qtyStr = etQuantity.text.toString().trim()
            var qtyDouble = qtyStr.toDouble()
            stockListData[position].selectedQty = qtyDouble
            adapter.notifyDataSetChanged()
            dialog.dismiss()
        }
    }

}


 for (i in 0 until stockListData.size){
            sum += stockListData[i].selectedQty
        }

如果用户多次编辑 Recyclerview 列表项,则每个值都添加到列表中。最后,如果我尝试检索得到错误值的所有 recyclerview 元素的总和,因为在我尝试替换元素时在模型类中添加了值。

【问题讨论】:

    标签: android kotlin android-recyclerview parcelable


    【解决方案1】:

    您可以只传递必须更新的单个项目,而不是将整个列表作为参数传递给 showAlertDialog() 方法。还有一件事,您不应该调用adapter.notifyDataSetChanged() 进行单项更新,而应调用adapter.notifyItemChanged(position)。看看下面的代码,我得到了正确的总和:

        private fun showRecipeMeasureDialog(recipeItem: RecipeItem?,position: Int){
    
        val dialogView = LayoutInflater.from(context).inflate(R.layout.add_recipe_measure_dialog, null)
        val dialog = AlertDialog.Builder(context, R.style.RoundedCornersDialog).setView(dialogView).show()
    
        dialog.setCancelable(false)
        val displayRectangle = Rect()
        val window = activity?.window
        window?.decorView?.getWindowVisibleDisplayFrame(displayRectangle)
        dialog.window?.setLayout(
            (displayRectangle.width() * 0.5f).toInt(),
            dialog.window!!.attributes.height
        )
        context?.resources?.let {
            dialogView.findViewById<TextView>(R.id.recipe_measure_title).text = java.lang.String.format(it.getString(R.string.addRecipeMeasure), unitsArray[currentMeasurementUnits - 1])
        }
        val doneBtn = dialogView.findViewById<ImageButton>(R.id.recipe_measure_done_btn)
        val closeBtn = dialogView.findViewById<ImageButton>(R.id.close_btn_add_recipe)
        val conversionEditText = dialogView.findViewById<ClearFocusEditText>(R.id.recipe_conversion_tie)
        doneBtn.isEnabled = false
    
        if (recipeItem != null ){
            conversionEditText.setText("${recipeItem.conversionRatio}")
        }
    
        closeBtn.setOnClickListener {
            context?.hideKeyboard(it)
            dialog.dismiss() }
    
        doneBtn.setOnClickListener {
            context?.hideKeyboard(it)
            val conversionRatio = conversionEditText.text.toString().toFloat()
            if (recipeItem != null){
                recipeItem.conversionRatio = conversionRatio
                recipeItemList[position] = recipeItem
    
                recipeAdapter.notifyItemChanged(position)
            }else{
                recipeItemList.add(0,RecipeItem(0,0,conversionRatio,0)) // Use your data class in place of RecipeItem
                recipeAdapter.notifyItemInserted(0)  // new Item is added to index zero, so adapter has to be updated at index zero
            }
            // calculating sum
            val sum = recipeItemList.map { it.conversionRatio }.sum()
            Log.d("tisha==>>","Conversion ratio sum = $sum")
            dialog.cancel()
        }
    }
    

    【讨论】:

    • 对不起,这里粘贴代码时打错了,它只是 stockData
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多