Unable to access variable from innerclass : Kotlin

2019-02-21 14:41发布

问题:

I am new to Kotlin development in android. here I am trying to access a variable defined in a class from it's inner class as below.

class MainActivity : AppCompatActivity() {

    var frags: MutableList<Fragment> = mutableListOf()

//.............onCreate and other methods ....

    internal class CustAdapter(var arrayList: ArrayList<NavigationData>) : RecyclerView.Adapter<CustAdapter.MyViewHolder>() {
    override fun onBindViewHolder(holder: MyViewHolder?, position: Int) {
        holder!!.bindItems(arrayList[position])
    }

    override fun getItemCount(): Int {
        return arrayList.size
    }
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustAdapter.MyViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.navigation_item, parent, false)
        return MyViewHolder(v)
    }

    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun bindItems(data: NavigationData) {


            itemView.setOnClickListener {
                   frags.add(BoardFrag()) ///// here i'm getting error "unresolved symbol"

            }
        }
    }
}    
}

inside inner class MyViewHolder it is not allowing me to access any variable of outer scope.

even I'm unable to access view ids imported from import kotlinx.android.synthetic.main.activity_main.* inside inner class methods.

I was able to access variables in such a way in java but i have read many question on stackoverflow but i didn't get answer yet.

回答1:

You should use the inner modifier in your adapter.

This modifier makes the inner class have access to the members of the outer class

Reference: https://kotlinlang.org/docs/reference/nested-classes.html



回答2:

Define your nested class as inner then you will be able to access outer class member variable

class OuterClass{

var accessMe ="access me from Inner Class"

inner class InnerClass{

   //....
}

}



回答3:

to answer this question for the fast an easy way i would do something like following :

class OuterClass{

private var accessibleInside: CustomObject? = null
inner class InnerClass{

    //....
}

now the CustomObject could be anything from Context to String hope this helps someone.