当前位置: 首页 > 知识库问答 >
问题:

null不能强制转换为非null类型kotlin.collections.List-kotlin

唐景山
2023-03-14

我正在尝试在RecyclerView中添加搜索过滤功能。但应用程序因以下错误而崩溃:

科特林。TypeCastException:null不能转换为非null类型kotlin。收藏。请登录com。卡贝拉什。电影。用户界面。PostListAdapter$searchFilter$1。在android上发布结果(PostListAdapter.kt:87)。小装置。筛选$ResultsHandler。android上的handleMessage(Filter.java:284)。操作系统。汉德勒。android上的dispatchMessage(Handler.java:107)。操作系统。活套。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()
        }
    }
}

如果你需要任何其他的课堂文件,请一定告诉我。有人能帮我解决吗?

共有3个答案

终翰学
2023-03-14

正如另外两个答案正确地指出的那样,你的会产生结果。值为空。但是代码清楚地表明,从performFiltering返回的FilterResults总是有一个非空的字段。这怎么会发生?

简单看一下Filter源代码给出了一个可能的答案:

// Filter.RequestHandler.handleMessage(Message msg)

try {
    args.results = performFiltering(args.constraint);
} catch (Exception e) {
    args.results = new FilterResults();
    Log.w(LOG_TAG, "An exception occured during performFiltering()!", e);
}

简单地说,如果performFiltering()抛出异常,则过滤器会捕获该异常,并使用空的FilterResults来代替否则将返回的内容。此异常的堆栈跟踪可以在logcat中找到。

查看您的performFiltering函数,唯一突出的异常是UninitializedPropertyAccessException。如果这是抛出的异常,可以通过检查fullPostList属性是否已初始化或显式将其初始化为空列表来修复它。

宋昕
2023-03-14

在执行强制转换之前,您必须执行空检查,请按以下方式修改pulishResults方法。

   override fun publishResults(constraint: CharSequence?,results: FilterResults) {
                postListFiltered = if(results == null || results.values == null)
                                       ArrayList<Data>() 
                                   else
                                        results.values
                notifyDataSetChanged()
            }
黎奇思
2023-03-14

就是这一行:results.valuesList

结果。值为空,您告诉它为非空列表,但它不能这样做。

 类似资料:
  • 我正在尝试初始化菜单上的自定义搜索工具(3d库),但我得到了错误。 但这无助于第136行对应于 菜单的xml

  • 请不要标记为重复,因为问题略有不同--- 风景:- 我一直在使用改装执行删除购物车。。 如果至少存在一个项目,它将显示在recyclerview中 2.if购物车是空的,它崩溃与上述错误 这是我的适配器代码:- 这是我的活动: } 我试过这个- 1-- 2-- 3-- 对Arraylist执行Mutablelist后的错误日志 但似乎没有什么是处理null 请帮帮我

  • 问题内容: 让我们假设下表(例如,几个内部join语句的结果): 例如,您可以从以下语句中获取: 现在,如果我想将t1.column_1和t2.column_2总结如下 结果显示如下: 我的问题基本上是:有没有一种方法可以将NULL类型转换为0以便进行一些数学运算? 我曾尝试和,而是保持一个。 问题答案: 使用的列值转换到零。或者,COALESCE函数将执行相同的操作,除了(1)符合ANSI标准,

  • 从上面的标题来看,目前我遇到了一个问题,即无法从一个模型类转换到另一个模型类。我写的代码有问题吗?请随时向我询问更多信息。非常感谢。 我怀疑: 这种方法“selectTheOldFnException”有一些错误,那就是使用了hibernate,但我不确定这个理论。 REST控制器 使用HIBERNATE-MatchingEngine选择POJO。班 POJO班 例外代码

  • 我将调用(used)的响应传递给一个类,并尝试将其强制转换到我的模型类。由于我对调用使用的是registfit,因此它在使用GSON将其转换为模型类对象之前,根据服务器的响应生成一个链接的hashmap。(这就是我所理解的,如果我错了请纠正我)。我已经附加了一个使用response对象进行调试时可以看到的图像。如何将此响应转换为我的模型类或类型对象的对象。当我试图将类型对象强制转换到活动中的模型类

  • 应用程序属性 我也试图改变mysql的版本仍然一样。我该怎么解决这个?