Фрагмент абстрактного рециклера в Котлине - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь создать класс абстрактного фрагмента, который устанавливает представление переработчика. Это соответствующая часть моего адаптера:

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<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)
}

На этот раз ошибка:

Несоответствие типов: предполагаемый тип - PeopleAdapter, но Ожидание RecyclerView.Adapter

Опять же, я ожидаю, что типы выстроятся в линию, но не уверен, что делаю неправильно.

1 Ответ

1 голос
/ 09 апреля 2019

Определите ваши универсальные типы в абстрактном классе и предоставьте их в конкретной реализации:

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<RecyclerView.ViewHolder>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...