课程的实践项目,还是遇到了一些坑的
setItemChecked
这里要实现的是listView的多选模式,选中的item背景变色。可是点击了之后item怎么也不显示选中状态,排查后发现一开始用一个布尔变量维护进入和退出多选状态,根本没有把listView设置成多选模式
问题:
1、listView中的item必须是checkable的
2、需要设置好listView多选模式
解决方案:
//解决check状态一直为false
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE)
listView.setItemChecked(position,true)
至于checkable的listView,参考https://blog.csdn.net/attheway/article/details/38734175#
删除后动态更新listView
首先要在AndroidManifest.xml添加权限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
删除逻辑处理:
del.setOnClickListener{
for (i in 0 until adapter.count) {
if (listView.isItemChecked(i)) {
val queryName = adapter.getItem(i)?.name // 要先获取查询姓名再删除
adapter.remove(adapter.getItem(i)) // 遍历adapter中的数据,找到被check项删除
adapter.notifyDataSetChanged()
/* 在原数据库中删除联系人 */
// 首先检查有无权限
if(ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_CONTACTS)!= PackageManager.PERMISSION_GRANTED){
// 没有则发起权限请求
ActivityCompat.requestPermissions(this,
arrayOf(Manifest.permission.WRITE_CONTACTS),1)
}
else{
// 有权限 进行操作
var uri: Uri = ContactsContract.RawContacts.CONTENT_URI // 选择的表名
val resolver = contentResolver
val where = ContactsContract.PhoneLookup.DISPLAY_NAME // 选择的列名
val cursor: Cursor? = resolver.query(uri,arrayOf(ContactsContract.Data._ID),
"$where=?",arrayOf(queryName),null)
if (cursor!!.moveToFirst()) {
val id: Int = cursor.getInt(0)
//根据id删除data中的相应数据
resolver.delete(uri, "$where=?", arrayOf(queryName))
uri = ContactsContract.Data.CONTENT_URI
resolver.delete(uri,ContactsContract.Data.RAW_CONTACT_ID + "=?",arrayOf(id.toString() + ""))
}
}
}
}
listView.clearChoices()
Toast.makeText(this,"删除成功啦",Toast.LENGTH_SHORT).show()
}