无法访问Kotlin中内部类的var对象

时间:2018-10-19 05:14:13

标签: android android-recyclerview kotlin recycler-adapter

我正在尝试在Kotlin中为Android编写RecyclerView适配器类。我试图使用为自定义对象创建自定义查看器类的传统方式,并在其中使用单击侦听器。虽然我可以做其他事情,例如访问内部类的变量并显示RecyclerView,但我无法做的是将click侦听器添加到内部类的var对象中。

即类似

 var convertView : View? = itemView

convertView.setOnClickListener(this)

以下是我适配器类的完整代码

public open class TestAdapter(val items: MutableList<Any>, val context: Activity) : RecyclerView.Adapter<TestAdapter.CustomViewHolder>() {

public var mItem: MutableList<Any> = items
public var mActivity: Activity = context
protected var clickListener: ExampleInterface? = null
public interface ExampleInterface {

    fun click(pos: Int) {

    }
}


open public fun setListener(mInterFaceListener: ExampleInterface) {
    clickListener = mInterFaceListener
}

override fun onCreateViewHolder(p0: ViewGroup, p1: Int): CustomViewHolder {
    var parentLayout: View = LayoutInflater.from(mActivity).inflate(R.layout.custom_view, p0, false)
    return CustomViewHolder(parentLayout)

    //  return CustomViewHolder(LayoutInflater.from(mActivity).inflate(R.layout.custom_view, p0, false))
}

override fun getItemCount(): Int {
    return mItem.size
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

override fun onBindViewHolder(p0: CustomViewHolder, p1: Int) {

    p0.dataView.text = mItem.get(p1).toString()

}

inner class CustomViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
    var convertView: View? = itemView
    var dataView: TextView = convertView!!.findViewById(R.id.data)

    var mposition = adapterPosition

    override fun onClick(p0: View?) {

        if (clickListener != null) {
            clickListener!!.click(mposition)
        }
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

}

}

因此,如果您在CustomView类中看到这两行

var convertView: View? = itemView
    var dataView: TextView = convertView!!.findViewById(R.id.data)

我无法访问这些变量“ convertView”和“ dataView”,因此可以为它们设置clicklistener。那么如何实现呢? 谢谢:)

3 个答案:

答案 0 :(得分:1)

RecyclerView适配器中,您可以将OnClickListeners放在onCreateViewHolder中,以防止每次调用onBindViewHolder时都将它们设置为{{1} onBindViewHolder滚动时被多次调用)。在RecyclerView中使用parentLayout访问您的视图并将onCreateViewHolder设置为它们。确定onClickListener中的当前位置,您可以执行以下操作:

onCreateViewHolder

更新: 我更新了上面的代码片段,并添加了override fun onCreateViewHolder(p0: ViewGroup, p1: Int): CustomViewHolder { val parentLayout: View = LayoutInflater.from(mActivity).inflate(R.layout.custom_view, p0, false) val customViewHolder = CustomViewHolder(parentLayout) parentLayout.myExampleTextView.setOnClickListener { // Place onClick logic here. // If you need position, do as bellow : val adapterPosition = customViewHolder.adapterPosition if(adapterPosition != RecyclerView.NO_POSITION) { // Place your position dependent logic here } } return customViewHolder } (等于-1)检查。下面解释了将位置返回为-1的原因。

  

来自android文档:

     

另一组与职位相关的方法的形式为    AdapterPosition 。 (例如,getAdapterPosition(),findViewHolderForAdapterPosition(int)),您应该使用以下方法   当您需要使用最新的适配器位置时,即使它们   可能尚未反映到布局中。例如,如果您想   在ViewHolder单击上访问适配器中的项目,您应该使用   getAdapterPosition()。请注意,这些方法可能无法   如果已调用notifyDataSetChanged(),则计算适配器位置   并且尚未计算出新版式。因此,您   应该谨慎处理NO_POSITION或这些结果为空   方法。

答案 1 :(得分:0)

您可以通过onBindViewHolder使用p0p0.dataView中访问它们,以便您可以成功设置侦听器

答案 2 :(得分:0)

我提到了这个网站

  

https://www.raywenderlich.com/367-android-recyclerview-tutorial-with-kotlin

在这里,我要知道我的错误,我需要在类中使用init,在那里我可以访问它并在Click侦听器上进行初始化。可以正常工作

   init {
            convertView?.setOnClickListener(this)
        }

尽管上面的答案也是可以接受的,但由于我是Kotlin的新手,所以我不能说哪个是更好的选择,但是我对上述站点的要求很满意。

谢谢:)