2017-07-31 42 views
6

我想從PersonAdapter類訪問MainFragment類的成員,但它們都不可用。我試圖讓班級和成員都公開和私人,但迄今爲止沒有任何工作。 我想我錯過了一些明顯的東西,但我無法弄清楚。我無法從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) 
     } 
    }} 

回答

16

在科特林,嵌套類不能默認在Java訪問外部類的實例,就像嵌套static class ES。

爲了做到這一點,在inner改性劑添加到嵌套類:

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

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

請參見:語言參考

+1

我甚至讀過那個頁面......但由於一些愚蠢的原因,我試圖讓'onBindViewHolder'方法在內部...... – ftibi93

5

在科特林Nested classes,有兩種類型的嵌套類的。

  1. 嵌套類
  2. 內類

嵌套類不允許訪問外部類中的成員。

如果您想要訪問嵌套類中的外部類的成員,那麼您需要將該嵌套類定義爲內部類。

class OuterClass{ 

    var name="john" 

    inner class InnerClass{ 

     //.... 
    } 

}