【问题标题】:Android recyclerview with different view type in kotlin在 kotlin 中具有不同视图类型的 Android recyclerview
【发布时间】:2018-11-07 12:09:48
【问题描述】:

我在 Kotlin 中使用(技术动态方法调度或运行时多态性)创建了一个具有多种视图类型的 RecyclerView, 现在我有了ViewHolder如下图

abstract class BaseViewHolder<T> internal constructor(itemView: View) : RecyclerView.ViewHolder(itemView){

    abstract fun bind(_object:T)
}

我有如下图的适配器

class activation_items_main_activity (list: List<out BaseModel>,context: Context):RecyclerView.Adapter<BaseViewHolder<*>>() {

    private var mList: List<out BaseModel>? = null
    private var mInflator:LayoutInflater ? = null

    init {

        this.mList = list
        this.mInflator = LayoutInflater.from(context)

    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<*> {

        when (viewType)
        {
            Constant_ViewType_RecyclerView.ViewType.ListOfActivation_Type1 -> return ListOfActivation_MainActivity_Holder(mInflator!!.inflate(R.layout.activities_layout_item,parent,false))
            Constant_ViewType_RecyclerView.ViewType.ListOfActivation_Type2 -> return ListOfActivation_MainActivity2_Holder(mInflator!!.inflate(R.layout.activities_layout_items_type2,parent,false))
        }

        return null // -----> **problem return null** 

    }

    override fun getItemCount(): Int {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun onBindViewHolder(holder: BaseViewHolder<*>, position: Int) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun getItemViewType(position: Int): Int {
        return mList!![position].viewType
    }

    class ListOfActivation_MainActivity_Holder(itemView: View):BaseViewHolder<ListOfActivation_MainActivity>(itemView)
    {

        override fun bind(_object: ListOfActivation_MainActivity) {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }

    }

    class ListOfActivation_MainActivity2_Holder(itemView: View):BaseViewHolder<ListOfActivation2_MainActivity>(itemView)
    {
        override fun bind(_object: ListOfActivation2_MainActivity) {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }

    }

现在我无法在表达式When() 后的onCreateViewHolder 方法中返回空值并显示消息错误“Null 不能是非空类型BaseViewHolder 的值” 不知道怎么解决。

【问题讨论】:

标签: android kotlin android-recyclerview


【解决方案1】:
  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<*> {
        return when (viewType) {
            Constant_ViewType_RecyclerView.ViewType.ListOfActivation_Type1 -> ListOfActivation_MainActivity_Holder(mInflator!!.inflate(R.layout.activities_layout_item, parent, false))
            Constant_ViewType_RecyclerView.ViewType.ListOfActivation_Type2 -> ListOfActivation_MainActivity2_Holder(mInflator!!.inflate(R.layout.activities_layout_item2, parent, false))      
            else -> throw IllegalStateException("Illegal view type")
        }
    }

【讨论】:

    【解决方案2】:

    不要在你的onCreateViewHolder方法中返回null,尝试如下代码

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<*> {
    
        when (viewType)
        {
            Constant_ViewType_RecyclerView.ViewType.ListOfActivation_Type1 -> return ListOfActivation_MainActivity_Holder(mInflator!!.inflate(R.layout.activities_layout_item,parent,false))
            else -> return ListOfActivation_MainActivity2_Holder(mInflator!!.inflate(R.layout.activities_layout_items_type2,parent,false))
        } 
    
    }
    

    【讨论】:

      猜你喜欢
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多