Как отслеживать мои проверенные флажки в пользовательском адаптере? - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь найти способ отслеживать все мои отмеченные элементы в пределах ListView из CheckBoxes.

В настоящее время я создаю свой настраиваемый адаптер для обработки всего, но могу отслеживать все мои отмеченные элементы, чтобы впоследствии я мог удалить отмеченные элементы нажатием кнопки.

IЯ не уверен, как справиться с этим. Я потратил несколько часов на поиск в Google, как это сделать, но большинство из них использует Java, и я не уверен, как правильно перевести его использование на Kotlin или даже если это будет применимо для моего приложения для Android. Если бы кто-нибудь мог мне помочь, то был бы очень признателен

DSArrayAdapter.kt - Мой пользовательский адаптер массива:

class DSArrayAdapter(context: Context, resource: Int, list: ArrayList<Contacts>) : ArrayAdapter<Contacts>(context, resource, list) {

    private val inflater: LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater

    override fun getView(position: Int, convertView: View?, parent: ViewGroup) : View {
        val rowView = inflater.inflate(R.layout.activity_listview, null)
        val item_name = rowView.findViewById<TextView>(R.id.contact_name)
        val item_checkbox = rowView.findViewById<CheckBox>(R.id.checked)

        item_name.setText(getItem(position)?.cname.toString())

        item_checkbox.setOnClickListener(View.OnClickListener{
            val contact = getItem(position) as Contacts
            contact.cchecked = !contact.cchecked
            item_checkbox.isChecked = contact.cchecked
    })
        })

        return rowView
    }
}

Contacts.kt - Мой класс для хранения свойств записей моих контактов:

class Contacts(val cname: String, val cphone: Int, val cchecked: Boolean) {

}

1 Ответ

1 голос
/ 10 октября 2019

Кажется, у объекта Contacts уже есть поле для отслеживания, если элемент отмечен или нет. Итак, вы можете использовать следующее:

Сначала сделайте cchecked переменную. Таким образом, его можно изменить.

// cchecked must be var so you can change between checked/unchecked
class Contacts(val cname: String, val cphone: Int, var cchecked: Boolean) {
}

Затем в адаптере:

class DSArrayAdapter(context: Context, resource: Int, list: ArrayList<Contacts>) : ArrayAdapter<Contacts>(context, resource, list) {

    private val inflater: LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater

    override fun getView(position: Int, convertView: View?, parent: ViewGroup) : View {

        val rowView = inflater.inflate(R.layout.activity_listview, null)
        val item_name = rowView.findViewById<TextView>(R.id.contact_name)
        val item_checkbox = rowView.findViewById<CheckBox>(R.id.checked)

        val contact = getItem(position) as Contacts

        // Set text
        item_name.setText(contact.cname)

        // Set checkbox state
        item_checkbox.isChecked = contact.cchecked

        // If does not have a click listener yet, set one.
        // View will be re-used. So, you don't need to set a listener everytime
        if(!item_checkbox.hasOnClickListeners()) {
            item_checkbox.setOnClickListener {
                // Get the old state
                val contact = getItem(position) as Contacts

                // Invert the old state in the contact
                contact.cchecked = !contact.cchecked

                // Apply the new state to the checkbox
                item_checkbox.isChecked = contact.cchecked
            }
        }
        return rowView
    }
}
...