Не удается получить доступ к объекту var внутреннего класса в kotlin - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь написать класс адаптера RecyclerView в Kotlin для Android.Я пытаюсь использовать традиционный способ создания настраиваемого класса средства просмотра для пользовательских объектов и использую в этом прослушиватель щелчков.В то время как я могу делать остальные вещи, такие как доступ к переменным внутреннего класса и показывать 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 голосов
/ 19 октября 2018

В RecyclerView адаптерах. Вы можете поместить OnClickListeners в onCreateViewHolder, чтобы предотвратить их установку при каждом вызове onBindViewHolder (как 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
}

ОБНОВЛЕНИЕ: Я обновил фрагмент кода выше и добавил RecyclerView.NO_POSITION (что равно -1) проверять.Причина, по которой позиция возвращается как -1, объясняется ниже.

Из документов Android:

Другой набор методов, связанных с позицией, имеет вид AdapterPosition .(например, getAdapterPosition (), findViewHolderForAdapterPosition (int)) Эти методы следует использовать, когда вам нужно работать с последними позициями адаптера, даже если они еще не были отражены в макете.Например, если вы хотите получить доступ к элементу в адаптере по щелчку ViewHolder, вы должны использовать getAdapterPosition ().Помните, что эти методы не смогут рассчитать позиции адаптера, если вызван notifyDataSetChanged (), а новый макет еще не рассчитан.По этой причине вам следует тщательно обрабатывать NO_POSITION или нулевые результаты этих методов.

0 голосов
/ 22 октября 2018

Я ссылался на этот сайт

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

Здесь я узнаю свою ошибку, мне нужно использовать init в классе, там я могучтобы получить доступ к нему и инициализировать на слушателя щелчка.Работает

   init {
            convertView?.setOnClickListener(this)
        }

Хотя приведенный выше ответ также может быть приемлемым, так как я новичок в Kotlin, я не могу сказать, какой из них лучше, но мое требование удовлетворено вышеупомянутым сайтом.

Спасибо:)

0 голосов
/ 19 октября 2018

вы можете получить к ним доступ в onBindViewHolder, используя p0 таким образом p0.dataView, чтобы вы могли успешно установить слушателей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...