2017-07-31 81 views
6

Chcę uzyskać dostęp do członka klasy MainFragment z klasy PersonAdapter, ale żaden z nich nie jest dostępny. Starałem się, aby zarówno klasy, jak i członkowie byli publiczni i prywatni, ale jak na razie nic nie działało. Chyba brakuje mi czegoś oczywistego, ale po prostu nie mogę tego rozgryźć.Nie mogę osiągnąć żadnego elementu klasy z klasy zagnieżdżonej w Kotlin

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

Odpowiedz

16

W Kotlin, klasy zagnieżdżone nie może uzyskać dostępu do zewnętrzną instancję klasy domyślnie, tak samo jak zagnieżdżone static class es w Javie.

Aby to zrobić, należy dodać modyfikator inner do zagnieżdżonej klasy:

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

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

zobacz: Nested classes w odniesieniu języka

+1

Nawet czytałem tę stronę ... ale z jakiegoś głupiego powodu próbowałem zrobić wewnętrzną metodę 'onBindViewHolder' ... – ftibi93

5

W Kotlin, są 2 rodzaje zagnieżdżonych klas.

  1. zagnieżdżony klasy
  2. klasa wewnętrzna

zagnieżdżony klasy nie może uzyskać dostęp do członu zewnętrznego klasy.

Jeśli chcesz uzyskać dostęp do elementu klasy zewnętrznej w klasie zagnieżdżonej, musisz zdefiniować tę klasę zagnieżdżoną jako klasę wewnętrzną.

class OuterClass{ 

    var name="john" 

    inner class InnerClass{ 

     //.... 
    } 

}