我在publishResults
方法内有以下代码,其中包含的适配器类实现Filterable
接口来过滤项目列表。
(目标:使用搜索视图过滤回收者视图中的项目)
override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
// taskList is of type MutableList<TaskItem>
taskList.clear()
// crash on
taskList.addAll(results!!.values as Collection<TaskItem>)
notifyDataSetChanged()
}
在点击搜索图标时,应用程序崩溃并显示以下错误
java.lang.ClassCastException: android.widget.Filter$FilterResults cannot be cast to java.util.Collection
AS还显示以下警告
Unchecked cast: Any! to Collection<TaskItem>
如何在不强制转换的情况下将taskList转换为Collection?
更新:
根据@Andrei的要求添加了performFiltering
方法
override fun performFiltering(constraint: CharSequence?): FilterResults {
val filteredList = ArrayList<TaskItem>()
if(constraint == null || constraint.isEmpty()){
filteredList.addAll(duplicatedTaskList)
}
else{
val filterPattern: String = constraint.toString().toLowerCase().trim()
for (taskItem in duplicatedTaskList){
if(taskItem.title.toLowerCase().contains(filterPattern))
filteredList.addAll(duplicatedTaskList)
}
}
val filterResults = FilterResults()
filterResults.values = filterResults
return filterResults
}
答案 0 :(得分:1)
您的performFiltering
方法中的
filterResults.values = filteredList
代替
filterResults.values = filterResults
然后您的代码进行转换就可以了
答案 1 :(得分:1)
results!!.values as Collection<TaskItem>
为空,使用results
的会给您一个例外,请考虑改用可空性运算符(results?.values
)。
也许可以尝试这样的方法:
val list = results?.values as? Collection<*>
list?.let{
//here, you can use `it` to check if your list is not null
}
答案 2 :(得分:0)
我将使用for循环对结果!!。values进行循环,并检查该项是否为TaskItem。 使if语句比使用as(广播)更安全,因为它可能导致未经检查的转换错误。
for (item in results!!.values) {
if(item is TaskItem) {
taskList.add(item)
} else {
// Item is not task item, handle it
}
}
修改
for (i in 0 until results!!.values.size) {
if(results!!.values.get(i) is TaskItem) {
taskList.add(item)
} else {
// Item is not task item, handle it
}
}
也尝试使用:
filterResults.values = filteredList