Дочерние представления расширяемого списка Android ведут себя неправильно при вводе данных в редактируемый текст дочернего макета

#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.