首页 > 解决方案 > 那么如何返回正确的 RecyclerView.ViewHolder

问题描述

在某一时刻,这是可以的,但编译器现在正对空返回值感到不满。我不确定如何设置它或者摆脱空值,返回正确的值或使返回值可选。任何有关如何启动和运行的建议表示赞赏。在网上找到了代码,但它说我编码的方式是有效的。

       override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {

        if(viewType==1) {
            val v = LayoutInflater.from(parent.context).inflate(R.layout.bus_list_row, parent, false)

            v.bus_url.setOnClickListener(object: View.OnClickListener {
                override fun onClick(p0: View?) {
                    Toast.makeText(
                            v.context,
                            "|" + v.bus_url.text + "|",
                            Toast.LENGTH_SHORT
                    ).show()
                }
            })
            return RowViewHolder(v)
        }

        if(viewType==0){
            val v = LayoutInflater.from(parent.context).inflate(R.layout.bus_list_section, parent, false)
            /*v.setOnClickListener(object:View.OnClickListener{
                override fun onClick(p0: View?) {
                    Toast.makeText(
                            v.context,
                            "|" + "test"+ "|",
                            Toast.LENGTH_SHORT
                    ).show()
                }
            })*/
            return SectionViewHolder(v)
        }
        return null
    }

标签: androidkotlin

解决方案


让我们稍微精简一下您的代码,以便于讨论:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    if(viewType==1) {
        // ...
        return RowViewHolder(v)
    }
    if(viewType==0){
        // ...
        return SectionViewHolder(v)
    }
    return null
}

基于此,我猜测您有一个相应的getItemViewType()方法,并且从此返回的唯一可能值是0and 1。如果我是对的,那么正确的做法是将您的 toreturn null更改onCreateViewHolder()throw AssertionError().

这里的逻辑是,作为人类,您比编译器更了解系统以及可能的情况。编译器只知道如果viewType不是 0 或 1,你将返回 null 并且 null 是不允许的。但作为一个人类,你知道它viewType只能是 0 或 1。调和这两个东西的正确方法是抛出一个错误。这样做有以下好处:

  • 满足编译器
  • 避免您必须编写代码来处理不可能的情况
  • 提供安全性,防止getItemViewType()在未来某个时间点进行更改但忘记更新onCreateViewHolder()(您将遇到一个非常明显的错误崩溃)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    if(viewType==1) {
        // ...
        return RowViewHolder(v)
    }
    if(viewType==0){
        // ...
        return SectionViewHolder(v)
    }
    throw AssertionError("impossible viewType: $viewType")
}

推荐阅读