Können wir Daten zur Laufzeit in der Adapterklasse speichern?Android

Forum für diejenigen, die für Android programmieren
Anonymous
 Können wir Daten zur Laufzeit in der Adapterklasse speichern?

Post by Anonymous »

Ich habe einige Probleme beim Speichern von Daten zu meiner Laufzeit (temporäres Speichern) in meiner Adapterklasse meines Bodsheets für eine Rechnungsanerkennung. /> Außerdem habe ich zwei Probleme für mein BottomSheet beim Speichern von Daten:-
(Hinweis:- UOM = Messeinheit, Qty = Menge) < /p>

zeigt, dass qty und uom auf Anerkennung uom und qty als Default-Saving-Saving. /> Wenn der Benutzer in einem anderen UOM eine bestätigte qty eingeben möchte (er ist erlaubt), aber qty nicht größer sein als gesendetes qty, aber wenn der Benutzer in 2 verschiedene UOM eingibt, die nicht überschritten werden, überschritten Sie nicht. UOM wird gezeigt, der zweite UOM 5 wird nicht gezeigt. Außerdem gibt es manchmal auch, wenn Standardeinstellung angezeigt wird und der Benutzer eingegeben wird. Jetzt habe ich Funktionen in meiner Adapterklasse erstellt, die Daten für eine temporäre Zeitdauer speichern, bis der Benutzer auf dem Bildschirm bestätigt wird. override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val currentItem = summaryResponse[position]
holder.Uom.text = currentItem.UOM_Code.toString()

// Check if this is the dispatched UOM
val isDispatchedUOM = currentItem.UOM_Code.equals(Duom, ignoreCase = true)

// Load previously saved value for this UOM, or default to empty
val savedQty = userEntries[currentItem.UOM_Code]?.Qty ?: ""

// Set default quantity only if this is the dispatched UOM and no other UOM has a valid quantity
if (isDispatchedUOM && userEntries.values.none { it.Qty.toDoubleOrNull() ?: 0.0 > 0 }) {
holder.Itemqty.setText(itemQty)
} else {
holder.Itemqty.setText(savedQty)
}

// Text change listener for handling user input
holder.Itemqty.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
val enteredQty = s?.toString()?.toDoubleOrNull() ?: 0.0
val maxQty = itemQty.toDoubleOrNull() ?: 0.0

// Calculate the current total quantity across all UOMs
val currentTotal = userEntries.values.sumOf { it.Qty.toDoubleOrNull() ?: 0.0 } -
(userEntries[currentItem.UOM_Code]?.Qty?.toDoubleOrNull() ?: 0.0) +
enteredQty

if (currentTotal > maxQty) {
// Show error if total quantity exceeds dispatch quantity
holder.Itemqty.error = "Total quantity exceeds Dispatch Item Quantity"
userEntries.remove(currentItem.UOM_Code) // Remove invalid entry
} else if (enteredQty > 0) {
// Save valid entries
userEntries[currentItem.UOM_Code] = SaveAcknowledgedInvoiceDTOItem(
PK_ID = pkId,
Unit_Code = currentItem.UOM_Code,
Qty = enteredQty.toString(),
RI = "1"
)

// Clearing the default quantity for the dispatched UOM if another UOM has a valid quantity
if (!isDispatchedUOM) {
userEntries.remove(Duom)
}

holder.Itemqty.error = null // Clear error message
} else {
// Remove entry if quantity is zero or negative
userEntries.remove(currentItem.UOM_Code)
}
}

override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
})
}

fun getUserEntries(): List {
return userEntries.values.toList()
}

fun setData(dataList: ArrayList) {
this.summaryResponse = dataList
notifyDataSetChanged()
}

fun setLoadedData(savedEntries: List) {
userEntries.clear()
savedEntries.forEach { entry ->
userEntries[entry.Unit_Code] = entry
}
notifyDataSetChanged()
}
< /code>
Und hier ist meine Bodsheet -Funktion und eine Antwortfunktion für meinen DTO, in der ich diese Adapterklasse verwende: < /p>
private fun openBottomSheet(
item_code: String?,
pk_ID: String,
item_qty: String?,
item_desc: String?,
item_uom: String?
) {
bottomSheetDialog = BottomSheetDialog(this, R.style.BottomSheetDialogTheme)
val view2: View = layoutInflater.inflate(R.layout.acknowledge_item_bottomsheet, null)

val card_recycler: RecyclerView = view2.findViewById(R.id.recyclerlist_bottom)
val text_save: TextView = view2.findViewById(R.id.txt_save)
val text_cancel: TextView = view2.findViewById(R.id.txt_cancel)
val txt_item_code: TextView = view2.findViewById(R.id.value_item_code)
val txt_item_desc: TextView = view2.findViewById(R.id.value_description)
val txt_item_qty: TextView = view2.findViewById(R.id.value_Qty)
val txt_item_uom: TextView = view2.findViewById(R.id.value_UOM)

txt_item_code.text = item_code ?: "N/A"
txt_item_desc.text = item_desc ?: "N/A"
txt_item_qty.text = item_qty ?: "0"
txt_item_uom.text = item_uom ?: "N/A"

val savedEntries = itemEntriesMap[pk_ID] ?: emptyList()

// Initialize the adapter
adpItemUom = ItemUOMAdapter(this, invoiceItemUom, pk_ID, item_qty ?: "0", dUom)

// Load saved entries into the adapter
if(savedEntries.isNotEmpty()){
adpItemUom?.setLoadedData(savedEntries)
}
//adpItemUom?.setLoadedData(ArrayList(savedEntries))

// Set the adapter
card_recycler.adapter = adpItemUom
bottomSheetDialog!!.setContentView(view2)
scrollToBottom(card_recycler)

text_cancel.setOnClickListener {
bottomSheetDialog?.dismiss()
pkID = ""
dUom = ""
}

text_save.setOnClickListener {
val currentEntries = adpItemUom?.getUserEntries()?.filter { it.Qty.toDoubleOrNull() ?: 0.0 > 0 }

if (!currentEntries.isNullOrEmpty()) {
// Calculate the total entered quantity
val totalQuantity = currentEntries.sumOf { it.Qty.toDoubleOrNull() ?: 0.0 }
val maxQty = item_qty?.toDoubleOrNull() ?: 0.0

if (totalQuantity > maxQty) {
errorMessagedialog(this, "Total quantity across all UOM fields exceeds Dispatch Item Quantity ($maxQty)")
} else {
// Save the valid entries into the map for acknowledgment
itemEntriesMap[pkID] = currentEntries
bottomSheetDialog?.dismiss()
}
} else {
errorMessagedialog(this, "Please enter valid quantities for at least one UOM field.")
}
}
}

private fun checkitemUOMResponse() {
viewmodel?.checkItemUOMLD()
?.observe(this, Observer { resource ->
if (resource == null) {
return@Observer
}
when (resource.status) {
Status.LOADING -> {
}
Status.SUCCESS -> {
dismissProgressDialog()

if (resource.data != null) {
val dataItem = resource.data
if (dataItem.Loving != null) {
invoiceItemUom.clear()
invoiceItemUom.addAll(dataItem.Loving as ArrayList)
adpItemUom?.setData(invoiceItemUom)
// val savedEntries = itemEntriesMap[pkID] ?: emptyList()
// if(savedEntries.isNotEmpty()){
// adpItemUom?.setLoadedData(savedEntries)}
// else{
//
// }
}
}
}
Status.ERROR -> {
dismissProgressDialog()
Toast.makeText(
this,
resources.getString(R.string.wrong),
Toast.LENGTH_LONG
).show()
}
}
})
}
< /code>
Ich glaube, die Verwendung (IF-ELSE) in der Adapterklasse und in Bottomsheet-Funktion erstellt ein Speicherleck, da ich Probleme beim Speichern von Daten habe. Wenn jemand zuvor so etwas konfrontiert hat, helfen Sie bitte, da ich an diesem Problem in den letzten 10 Tagen festgefahren bin.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post