我正在尝试在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。那么如何实现呢? 谢谢:)
答案 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
使用p0
在p0.dataView
中访问它们,以便您可以成功设置侦听器
答案 2 :(得分:0)
我提到了这个网站
https://www.raywenderlich.com/367-android-recyclerview-tutorial-with-kotlin
在这里,我要知道我的错误,我需要在类中使用init,在那里我可以访问它并在Click侦听器上进行初始化。可以正常工作
init {
convertView?.setOnClickListener(this)
}
尽管上面的答案也是可以接受的,但由于我是Kotlin的新手,所以我不能说哪个是更好的选择,但是我对上述站点的要求很满意。
谢谢:)