Kotlin中List<Contact>初始化要求传参,add、lowercase方法不识别问题
问题原因及解决方案
1. List<Contact>() 报参数缺失错误的原因
- Kotlin 中的
List是只读集合接口,本身无公开构造方法,你调用的List()实际是标准库提供的工厂函数List(size: Int, init: (Int) -> T),要求必须传入集合长度和元素初始化逻辑两个参数,这是报错的直接原因。 - 你之前使用的
ArrayList是JDK提供的可变集合具体实现类,自带无参构造方法,二者定位完全不同,差异和你直接使用List<>有关。
2. add() 方法无法识别的原因
该问题同样和使用List<>有关:List 接口仅定义了读取集合的相关方法,没有add、remove这类修改集合的方法,只有MutableList(可变List接口)的实现才支持修改操作。
3. lowercase() 方法无法识别的原因
该问题和List<>无关:lowercase() 是String类的扩展方法,你直接对自定义的Contact类型对象调用该方法,自然找不到对应实现,需要先取Contact类中存储名称的字符串属性再调用小写转换方法。
修正后的代码示例
你可以直接用Kotlin内置的集合操作符简化筛选逻辑,无需手动创建集合写循环:
val contacts = remember { DataProvider.contactList } var filteredContacts: List<Contact> val textState = remember { mutableStateOf(TextFieldValue("")) } LazyColumn( ... ) { // 原代码此处textVal为笔误,修正为textState val searchText = textState.value.text filteredContacts = if (searchText.isEmpty()){ contacts } else { // 替换name为你Contact类中实际要匹配的字符串属性 contacts.filter { contact -> contact.name.lowercase(Locale.getDefault()) .contains(searchText.lowercase(Locale.getDefault())) } }
如果一定要手动写循环实现,可将else分支替换为如下代码:
else{ val resultList = mutableListOf<Contact>() for (contact in contacts) { if (contact.name.lowercase(Locale.getDefault()).contains(searchText.lowercase(Locale.getDefault()))) { resultList.add(contact) } } resultList }
内容的提问来源于stack exchange,提问作者Tomee
相关产品推荐
相关产品推荐

