Как удалить отмеченные элементы из списка? - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь удалить контакты из своего списка контактов в соответствии с установленными флажками рядом с именами контактов после нажатия кнопки удаления. Теперь я смог заставить работать код, когда у меня был один контакт в списке, но, как только я добавляю больше 1, он, кажется, не работает, независимо от того, как я настраиваю свой цикл. Либо он аварийно завершает работу, что, как я подозреваю, связано с проблемой «вне границ» в списке, либо, с моим текущим кодом, вообще ничего не делает. Я искал некоторые решения, но ни одно из них не сработало до сих пор. Если бы кто-нибудь мог мне помочь, это было бы оценено. Я включил соответствующий код ниже в мою текущую реализацию:

MainActivity.kt:

class MainActivity : AppCompatActivity() {

var CONTACT_DETAIL_ACTIVITY_REQUEST = 0

var listContacts = ArrayList<Contacts>()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setTitle("Contacts")

    val contactAdapter = DSArrayAdapter(this, R.layout.activity_listview, listContacts)
    val listView1 = findViewById<ListView>(R.id.contact_list)
    listView1.setAdapter(contactAdapter)

    listContacts.add(Contacts("Faisal is spoiled", 732, false))
    listContacts.add(Contacts("Dawg", 666, false))
    contactAdapter.notifyDataSetChanged()

    val add_new_contact = findViewById<Button>(R.id.add_contacts)
    val delete_contacts = findViewById<Button>(R.id.delete_contacts)

    //*** Delete Function ***///
    delete_contacts.setOnClickListener({
        var newlistContacts = ArrayList<Contacts>()
        for (x in listContacts) {
            if (x.cchecked == false) {
                newlistContacts.add(x)
            }
        }
        listContacts = newlistContacts
        contactAdapter.notifyDataSetChanged()
    })
    //*** Delete Function ***///

    add_new_contact.setOnClickListener {
        val name = ""
        val phone_number = 1
        val relationship = ArrayList<String>()

        val intent1 = Intent(this,ContactDetails::class.java)
        startActivityForResult(intent1, CONTACT_DETAIL_ACTIVITY_REQUEST)
    }
    }
    }

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
    }
    }

1 Ответ

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

Вы изменяете свой список контактов с помощью

listContacts = newListContacts

Но ваш адаптер не знает новых списков контактов. Вы можете скопировать вызовы listContacts.clear () и listContacts.addAll (newListContacts) Но это будет много работы, если вы будете копировать списки.

Попробуйте изменить свой блок удаления на:

delete_contacts.setOnClickListener({
  listContacts.removeIf { it.cchecked }
  contactAdapter.notifyDataSetChanged()
})
...