Переопределение «функции верхнего уровня» - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь создать класс BaseRecyclerViewAdapter<T>:RecyclerView.Adapter<T>, чтобы обеспечить стандартную / общую функциональность для классов, использующих дженерики.Из-за различий в моделях представления методы onBindViewHolder и onCreateViewHolder генерируют NotImplementedError в базовом классе.Теперь, когда я хочу реализовать методы в классах, которые наследуют BaseRecyclerViewAdapter<T>, я сталкиваюсь со следующей ошибкой:

Modifier 'override' is not applicable to 'top level function'

Как я могу безопасно переопределить те, не сталкиваясь с этой ошибкой?

Base.kt:

package com.example

        abstract class BaseAdapter<T, THolder: RecyclerView.ViewHolder>  (
        private val mValues: List<T>,
        private val mListener: OnFragmentInteractionListener<T>?
    )  : RecyclerView.Adapter<THolder>() {
        private val mOnClickListener: View.OnClickListener
        init {
            mOnClickListener = View.OnClickListener { v ->
                val item = v.tag as T
                mListener?.onListFragmentInteraction(item)
            }
        }

         override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): THolder {
            throw NotImplementedError()
        }

        override fun onBindViewHolder(holder: THolder, position: Int) {
            throw NotImplementedError()
        }

        override fun getItemCount(): Int = mValues.size


    //And some other fancy methods
    }

Другой класс.kt:

package com.example
class TheAdapter(
    private val mValues: List<Item>,
    private val mListener: OnFragmentInteractionListener<Item>?
) : BaseAdapter<Item, ViewHolder>(mValues, mListener)

//Error here
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {

    }

//Error here
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {

    }

    inner class ViewHolder(val mView: View) : RecyclerView.ViewHolder(mView) {
        //ViewHolder properties and methods
    }
}

1 Ответ

0 голосов
/ 27 сентября 2019

Вы перегружены именем класса ViewHolder.ViewHolder в вашем определении класса RecyclerView.ViewHolder.Тот, что в сигнатуре вашей функции, является вашим внутренним классом.Вы должны указать свой внутренний в определении класса: BaseAdapter<String, TheAdapter.ViewHolder>, чтобы избежать путаницы.Или еще лучше, используйте другое имя класса для своего внутреннего класса.

...