#android #kotlin #expandablelistview
Вопрос:
Я должен ввести текст в EditText в каждом дочернем представлении и рассчитать его сумму для каждой группы. Проблема в том, что когда я ввожу значение в EditText в группе и после этого пытаюсь расширить группу над ней, значение из текущей группы смещается в ту, которую я расширил.
Любая помощь будет признательна.
Вот мой код класса адаптера:
package com.safeguard.adapter
import android.content.Context
import android.text.TextWatcher
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.*
import androidx.appcompat.widget.AppCompatImageView
import com.safeguard.R
import com.safeguard.model.AdditionalService
import com.safeguard.model.PpmServiceAdditional
import com.safeguard.model.ServiceDetailAdditional
import com.safeguard.utils.Utils
import java.util.*
class NewAdapterAdditionalService(
val context: Context,
val additionalServices: Vector<AdditionalService>,
private val expandableListView: ExpandableListView,
private var totalAmount: Int,
var textWatcher: TextWatcher
) : BaseExpandableListAdapter() {
private val CHILD_LAYOUT_A: Int = 1
private val CHILD_LAYOUT_C: Int = 2
private var groupPos = -1
private var childPos = -1
override fun getGroupCount(): Int {
return additionalServices.size
}
override fun getChildrenCount(groupPosition: Int): Int {
return additionalServices[groupPosition].additionalServiceList!![0].serviceDetails!!.size
}
override fun getGroup(groupPosition: Int): Any {
return additionalServices[groupPosition].additionalServiceList!![0]
}
override fun getChild(groupPosition: Int, childPosition: Int): Any {
return additionalServices[groupPosition].additionalServiceList!![0].serviceDetails!![childPosition]
}
override fun getGroupId(groupPosition: Int): Long {
return groupPosition.toLong()
}
override fun getChildId(groupPosition: Int, childPosition: Int): Long {
return childPosition.toLong()
}
override fun hasStableIds(): Boolean {
return true
}
override fun getGroupView(groupPosition: Int, isExpanded: Boolean, convertView: View?, parent: ViewGroup?): View {
var convertView = convertView
val additionalService = getGroup(groupPosition) as PpmServiceAdditional
if (convertView == null) {
val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
convertView = inflater.inflate(R.layout.each_row_header_additional_service, null)
}
val checkboxGroupAdditionalService = convertView!!.findViewById<AppCompatImageView>(R.id.checkbox_group_additional_service)
val additionalServiceName = convertView!!.findViewById<TextView>(R.id.textView_additional_service_name)
val textViewCountLeft = convertView!!.findViewById<TextView>(R.id.textView_additional_service_count)
additionalServiceName.text = additionalService.aditionalServiceName
val imageResourceId: Int = if (isExpanded) R.drawable.checked_blue else R.drawable.unchecked
checkboxGroupAdditionalService.setImageResource(imageResourceId)
if (additionalService.displayServiceCount == "Y") {
if (additionalService.availableServiceCount == "0" ||
additionalService.availableServiceCount == "") {
textViewCountLeft.setTextAppearance(context, R.style.hint_or_disable_text_normal)
additionalServiceName.setTextAppearance(context, R.style.hint_or_disable_text)
checkboxGroupAdditionalService.setImageResource(R.drawable.unchecked_disabled)
}
textViewCountLeft.text = "${additionalService.availableServiceCount}${context.resources.getString(R.string.remaining)}"
} else {
textViewCountLeft.text = ""
}
return convertView!!
}
override fun getChildView(groupPosition: Int, childPosition: Int, isLastChild: Boolean, convertView: View?, parent: ViewGroup?): View {
var convertView = convertView
val additionalServiceDetail = getChild(groupPosition, childPosition) as ServiceDetailAdditional
if (convertView == null) {
val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
convertView = inflater.inflate(R.layout.each_row_child_additional_service_layout_a, parent, false)
}
convertView!!.tag = getLayoutType(groupPosition,childPosition)
if (convertView!!.tag == CHILD_LAYOUT_A) {
val serviceDetailName = convertView!!.findViewById<View>(R.id.textView_additional_service_name) as TextView
val totalReimbursementAmount = convertView.findViewById<View>(R.id.total_reimbursement_amount_textView) as TextView
val serviceDetailEditText = convertView.findViewById<View>(R.id.txt_reimbursement_amt) as EditText
val serviceDetailCheckBox = convertView.findViewById<View>(R.id.checkbox_child_additional_service) as AppCompatImageView
val layoutB = convertView.findViewById<LinearLayout>(R.id.layout_b)
val layoutA =convertView.findViewById<RelativeLayout>(R.id.layout_a)
layoutB.visibility = View.GONE
layoutA.visibility = View.VISIBLE
serviceDetailName.text = additionalServiceDetail.name
serviceDetailCheckBox.setOnClickListener(View.OnClickListener { v: View? ->
additionalServiceDetail.isChildSelected = !additionalServiceDetail.isChildSelected!!
if (!additionalServiceDetail.isChildSelected!!) {
additionalServiceDetail.enteredReimbursementAmount = ""
}
notifyDataSetChanged()
})
if (additionalServiceDetail.isChildSelected!!){
serviceDetailEditText.isFocusable = true;
serviceDetailEditText.isEnabled = true;
serviceDetailEditText.isFocusableInTouchMode = true
serviceDetailEditText.background = context.getDrawable(R.drawable.inputfield_blank_new)
serviceDetailCheckBox.setImageResource(R.drawable.checked_blue)
} else {
serviceDetailEditText.isFocusable = false;
serviceDetailEditText.isEnabled = false;
serviceDetailEditText.background = context.getDrawable(R.drawable.inputfield_blank_disabled_new)
serviceDetailCheckBox.setImageResource(R.drawable.unchecked)
}
totalReimbursementAmount.text = additionalServices[groupPosition].additionalServiceList!![0].aditionalServiceName " "
context.resources.getString(R.string.TotalAmount) ":"
} else if (convertView!!.tag == CHILD_LAYOUT_C) {
val serviceDetailName = convertView!!.findViewById<View>(R.id.textView_additional_service_name_b) as TextView
val serviceDesc = convertView.findViewById<View>(R.id.service_notes) as TextView
val layoutA = convertView.findViewById<RelativeLayout>(R.id.layout_a)
val layoutB = convertView.findViewById<LinearLayout>(R.id.layout_b)
layoutA.visibility = View.GONE
layoutB.visibility = View.VISIBLE
serviceDetailName.text = additionalServiceDetail.name
serviceDesc.text = additionalServiceDetail.serviceNotes
} else {
val serviceDetailName = convertView!!.findViewById<View>(R.id.textView_additional_service_name_b) as TextView
val serviceDesc = convertView.findViewById<View>(R.id.service_notes) as TextView
serviceDesc.visibility = View.GONE
serviceDetailName.text = additionalServiceDetail.name
val layoutA = convertView.findViewById<RelativeLayout>(R.id.layout_a)
val layoutB = convertView.findViewById<LinearLayout>(R.id.layout_b)
layoutA.visibility = View.GONE
layoutB.visibility = View.VISIBLE
}
Utils.log("Group position: ", groupPosition.toString())
Utils.log("Child position: ", childPosition.toString())
return convertView!!
}
fun getLayoutType(groupPosition: Int, childPosition: Int): Int {
return when (additionalServices[groupPosition].additionalServiceList!![0].serviceDetails!![childPosition].costLayout) {
"A" -> CHILD_LAYOUT_A
"C" -> CHILD_LAYOUT_C
else -> 0
}
}
override fun isChildSelectable(groupPosition: Int, childPosition: Int): Boolean {
return false
}
}
Я новичок в Android, буду признателен за любую помощь.
Обновление: Когда я отладил, я обнаружил, что, когда я сначала расширяю вторую группу (группу 1), а затем расширяю первую группу, сначала вызывается дочернее представление для группы 0, а затем снова для группы 1 и в пользовательском интерфейсе значения из редактируемых текстов группы 1 смещаются в редактируемые тексты группы 0.