web-dev-qa-db-fra.com

Je ne peux atteindre aucun membre d'une classe imbriquée dans Kotlin

Je souhaite accéder à un membre de la classe MainFragment à partir de la classe PersonAdapter mais aucun d'eux n'est disponible. J'ai essayé de rendre les cours et les membres publics et privés aussi mais jusqu'à présent, rien n'a fonctionné. Je suppose que je manque quelque chose d'évident, mais je ne peux pas le comprendre.

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

Dans Kotlin, les classes imbriquées ne peuvent pas accéder à l'instance de classe externe par défaut, tout comme les imbriquées static classes en Java.

Pour ce faire, ajoutez le modificateur inner à la classe imbriquée:

class MainFragment : Fragment() {
    // ...

    inner class PersonAdapter() : RecyclerView.Adapter<ViewHolder>() {
        // ...
    }
}

Voir: Classes imbriquées dans la référence du langage

64
hotkey

Dans Kotlin, il existe 2 types de classes imbriquées.

  1. Classe imbriquée
  2. classe intérieure

Les classes imbriquées ne sont pas autorisées à accéder au membre de la classe externe.

Si vous souhaitez accéder au membre de la classe externe dans la classe imbriquée, vous devez définir cette classe imbriquée comme classe interne.

class OuterClass{

    var name="john"

    inner class InnerClass{

       //....
    }

}
8
AaRiF