web-dev-qa-db-ja.com

Kotlinのネストされたクラスからクラスメンバーに到達できません

PersonAdapterクラスからMainFragmentクラスのメンバーにアクセスしたいのですが、どれも利用できません。クラスとメンバーの両方を公開と非公開にしようとしましたが、今のところ何も機能しませんでした。明らかな何かを見逃していると思いますが、それを理解することはできません。

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

Kotlinでは、Javaのネストされたstatic classesと同様に、ネストされたクラスはデフォルトで外部クラスインスタンスにアクセスできません。

これを行うには、ネストされたクラスにinner修飾子を追加します。

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

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

参照: 言語リファレンスのネストされたクラス

64
hotkey

Kotlinには、2種類のネストされたクラスがあります。

  1. ネストされたクラス
  2. インナークラス

ネストされたクラスは、外部クラスのメンバーにアクセスできません。

ネストされたクラスの外部クラスのメンバーにアクセスする場合は、そのネストされたクラスを内部クラスとして定義する必要があります。

class OuterClass{

    var name="john"

    inner class InnerClass{

       //....
    }

}
8
AaRiF