未经检查的Cast警告和ClassCastException

时间:2019-07-28 09:54:16

标签: android kotlin searchview

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

3 个答案:

答案 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