Я пытаюсь создать абстрактный класс фрагментов, который настраивает представление ресайклера. Это соответствующая часть моего адаптера:
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)
:
Type mismatch: inferred type is PeopleAdapter but RecyclerView.Adapter was expected
Я не понимаю, почему это проблема. PersonAdapter
расширяет RecyclerView.Adapter
, а PersonViewHolder
расширяет RecyclerView.ViewHolder
, поэтому не подразумевается, что PersonAdapter
расширяет RecyclerView.Adapater<RecyclerView.ViewHolder>
?
Я попытался изменить метод 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)
}
На этот раз ошибка:
Type mismatch: inferred type is PeopleAdapter but RecyclerView.Adapter was expected
Опять же, я ожидаю, что типы выстроятся в линию, но не уверен, что я делаю неправильно.
Определите свои общие типы в абстрактном классе и предоставьте их в конкретной реализации:
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)
}
}
Самое близкое, что вы можете получить в настоящее время, - это unchecked cast :
return PeopleAdapter(context) as RecyclerView.Adapter<RecyclerView.ViewHolder>