我正在尝试在RecyclerView中添加可过滤搜索功能,但是应用程序崩溃并出现以下错误:
kotlin.TypeCastException: 无法将null转换为非空类型kotlin.collections.List at com.kabelash.movies.ui.PostListAdapter$searchFilter$1.publishResults(PostListAdapter.kt:87) at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:284) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214)
适配器:
class PostListAdapter: RecyclerView.Adapter<PostListAdapter.ViewHolder>(), Filterable {
private lateinit var postListFiltered:List<Data>
private lateinit var postListFull:List<Data>
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding: ListItemBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.context), R.layout.list_item, parent, false)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(postListFiltered[position])
}
override fun getItemCount(): Int {
return if(::postListFiltered.isInitialized) postListFiltered.size else 0
}
fun updatePostList(postList:List<Data>){
this.postListFiltered = postList
notifyDataSetChanged()
}
class ViewHolder(private val binding: ListItemBinding): RecyclerView.ViewHolder(binding.root){
private val viewModel = MoviesViewModel()
fun bind(post:Data){
viewModel.bind(post)
binding.viewModel = viewModel
}
}
override fun getFilter(): Filter? {
return searchFilter
}
private val searchFilter: Filter = object : Filter() {
override fun performFiltering(constraint: CharSequence?): FilterResults? {
val filteredList: MutableList<Data> = ArrayList()
if (constraint == null || constraint.isEmpty()) {
filteredList.addAll(postListFull)
} else {
val filterPattern = constraint.toString().toLowerCase().trim()
for (item in postListFull) {
if (item.title.toLowerCase().contains(filterPattern) || item.genre.toLowerCase().contains(filterPattern)) {
filteredList.add(item)
}
}
}
val results = FilterResults()
results.values = filteredList
return results
}
override fun publishResults(constraint: CharSequence?,results: FilterResults) {
postListFiltered = (results.values as List<Data>)
notifyDataSetChanged()
}
}
}
如果你需要其他的class文件,请让我知道。有人能帮我解决这个问题吗?
postListFiltered = (results.values as List<Data>)
中的result.values
是空的,这就是导致程序崩溃的原因。postListFiltered
是不可为空的。 - rorresults.values
怎么可能为空。过滤器的实现非常明显地总是会分配一个非空的值。你可以通过postListFiltered = (results.values as List<Data>?).orEmpty()
来避免立即报错,但这可能掩盖了你仍然需要解决的其他错误。 - Tenfour04