Я не могу связаться с членом класса из вложенного класса в Котлин
Я хочу получить доступ к классу MainFragment из класса PersonAdapter, но ни один из них не доступен. Я попробовал сделать и классы, и члены публичными и частными, но пока ничего не получилось.
Наверное, мне не хватает чего-то очевидного, но я просто не могу понять.
class MainFragment : Fragment() {
lateinit var personAdapter: PersonAdapter
lateinit var personListener: OnPersonSelected
private var realm: Realm by Delegates.notNull()
lateinit var realmListener: RealmChangeListener<Realm>
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val v = inflater.inflate(R.layout.fragment_main, container, false)
return v
}
class PersonAdapter() : RecyclerView.Adapter<ViewHolder>() {
var localPersonList = personList
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bindItems(localPersonList[position])
holder.itemView.setOnClickListener {
Toast.makeText(context, "click", Toast.LENGTH_SHORT).show()
//I want to reach personListener from here
}
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
val v = LayoutInflater.from(parent!!.context).inflate(R.layout.person_list_item, parent, false)
return ViewHolder(v)
}
}}
Ответы
Ответ 1
В Kotlin вложенные классы не могут обращаться к экземпляру внешнего класса по умолчанию, как вложенные static class
es в Java.
Для этого добавьте модификатор inner
вложенный класс:
class MainFragment : Fragment() {
// ...
inner class PersonAdapter() : RecyclerView.Adapter<ViewHolder>() {
// ...
}
}
Смотрите: Вложенные классы в справочной системе языка
Ответ 2
В Kotlin существует 2 типа вложенных классов.
- Вложенный класс
- внутренний класс
Вложенному классу не разрешается обращаться к члену внешнего класса.
Если вы хотите получить доступ к члену внешнего класса во вложенном классе, вам необходимо определить этот вложенный класс как внутренний класс.
class OuterClass{
var name="john"
inner class InnerClass{
//....
}
}