【问题标题】:How to delete checked items from a list?如何从列表中删除选中的项目?
【发布时间】:2019-10-11 18:59:38
【问题描述】:

按下删除按钮后,我正在尝试根据联系人姓名旁边的复选框从我的联系人列表中删除联系人。现在,当我在列表中有一个联系人时,我能够让代码工作,但是,一旦我添加超过 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
    }
    }

【问题讨论】:

    标签: android class android-listview android-adapter android-checkbox


    【解决方案1】:

    您正在更改您的列表联系人

    listContacts = newListContacts
    

    但是您的适配器不知道 newListContacts。 您可以复制调用 listContacts.clear() 和 listContacts.addAll(newListContacts) 但是,如果您复制列表,这将是很多工作。

    尝试将您的删除块更改为:

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

    【讨论】:

    • 不幸的是,我不允许使用该方法进行此分配,因为我必须使用 API 23 (6.0) 并且需要 API 24。但是您的第一个方法就像一个魅力。非常感谢!
    猜你喜欢
    • 2012-02-19
    • 2017-06-18
    • 1970-01-01
    • 2021-07-19
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多