Я пытаюсь добавить фильтруемый поиск в RecyclerView. но приложение вылетает со следующей ошибкой:
kotlin.TypeCastException: значение null не может быть приведено к типу, отличному от null (Filter.java:284) в android.os.Handler.dispatchMessage(Handler.java:107) в 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()
}
}
}
Если вам нужен какой-либо другой файл класса, пожалуйста, дайте мне знать. Может кто-нибудь, пожалуйста, помогите мне решить эту проблему?
postListFiltered = (results.values as List<Data>)
- это причина вашего сбоя.postListFiltered
не может принимать значение NULL. - person ror   schedule 16.12.2019results.values
может быть нулевым. Реализация фильтра очень четко всегда присваивает ему ненулевое значение. Вы должны быть в состоянии избежать непосредственной ошибки сpostListFiltered = (results.values as List<Data>?).orEmpty()
, но это, вероятно, маскирует какую-то другую ошибку, которую вам еще предстоит решить. - person Tenfour04   schedule 16.12.2019