【问题标题】:Abstract recycler fragment in KotlinKotlin 中的抽象回收器片段
【发布时间】:2019-04-09 20:24:48
【问题描述】:

我正在尝试创建一个设置回收器视图的抽象片段类。这是我的适配器的相关部分:

class PeopleAdapter(context: Context?) : RecyclerView.Adapter<PeopleAdapter.PersonViewHolder>() {

    inner class PersonViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        // ...
    }

    // ...
}

这是抽象片段:

abstract class RecyclerFragment : Fragment() {

    protected abstract fun createAdapter(context: Context?): RecyclerView.Adapter<RecyclerView.ViewHolder>

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.recycler_view, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val adapter = createAdapter(context)
        recycler_view.adapter = adapter

        // ...
    }
}

这就是我想使用它的方式:

class PeopleFragment : RecyclerFragment() {

    override fun createAdapter(context: Context?): RecyclerView.Adapter<RecyclerView.ViewHolder> {
        return PeopleAdapter(context)
    }
}

Android Studio 在return PeopleAdapter(context) 上抛出错误:

类型不匹配:推断的类型是 PeopleAdapter 但 应有 RecyclerView.Adapter

我不明白为什么会出现问题。 PersonAdapter 扩展了RecyclerView.Adapter,而PersonViewHolder 扩展了RecyclerView.ViewHolder,那么是不是暗示PersonAdapter 扩展了RecyclerView.Adapater&lt;RecyclerView.ViewHolder&gt;

我尝试改变createAdapter方法如下:

protected abstract fun <T : RecyclerView.ViewHolder?> createAdapter(context: Context?): RecyclerView.Adapter<T>

我也更改了实现:

override fun <T : RecyclerView.ViewHolder?> createAdapter(context: Context?): RecyclerView.Adapter<T> {
    return PeopleAdapter(context)
}

这一次,错误是:

类型不匹配:推断的类型是 PeopleAdapter 但 应有 RecyclerView.Adapter

再次,我希望类型能够排列,但不确定我做错了什么。

【问题讨论】:

    标签: android inheritance kotlin android-recyclerview abstract


    【解决方案1】:

    在抽象类中定义泛型类型,并在具体实现中提供它们:

    class PeopleAdapter(context: Context?) : RecyclerView.Adapter<PeopleAdapter.PersonViewHolder>() {
    
            inner class PersonViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
                // ...
            }
    
            // ...
     }
    
    abstract class RecyclerFragment<VH : RecyclerView.ViewHolder, out T :  RecyclerView.Adapter<VH>> : Fragment() {
    
        protected abstract fun createAdapter(context: Context?): T
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return inflater.inflate(R.layout.recycler_view, container, false)
        }
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            val adapter = createAdapter(context)
            recycler_view.adapter = adapter
    
            // ...
        }
    }
    
    class PeopleFragment : RecyclerFragment<PeopleAdapter.PersonViewHolder, PeopleAdapter>() {
    
        override fun createAdapter(context: Context?): PeopleAdapter {
            return PeopleAdapter(context)
        }
    }
    

    您目前可以获得的最接近的是未经检查的演员表:

    return PeopleAdapter(context) as RecyclerView.Adapter&lt;RecyclerView.ViewHolder&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多