Android 如何为RecyclerView适配器设置侦听器?

Android 如何为RecyclerView适配器设置侦听器?,android,android-recyclerview,kotlin,Android,Android Recyclerview,Kotlin,在我的main活动中有一个按钮和回收视图,带有CheckedTextView的适配器 当点击CheckedTextView时,我想启用按钮 我可以通过将按钮上下文设置为静态来实现它,但这并不好(内存泄漏等) 我试图从上下文中获取按钮,并在simpleCheckedTextView中启用它。setOnClickListener: class AndroidDeviceAdapter(internal var context: Context, private val devices: Array&

在我的
main活动中
有一个
按钮
回收视图
,带有
CheckedTextView
的适配器

当点击
CheckedTextView
时,我想启用
按钮

我可以通过将
按钮
上下文设置为
静态
来实现它,但这并不好(内存泄漏等)

我试图从
上下文中获取按钮,并在
simpleCheckedTextView中启用它。setOnClickListener

class AndroidDeviceAdapter(internal var context: Context, private val devices: Array<String>) :
    RecyclerView.Adapter<AndroidDeviceAdapter.MyViewHolder>() {

    inner class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        ...
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        ...
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        ...

        holder.simpleCheckedTextView.setOnClickListener {

        // Getting exception
        (context as Activity).findViewById<Button>(order_button).isEnabled = true
        }
    }
类AndroidDeviceAdapter(内部变量上下文:上下文,私有val设备:数组):
RecyclerView.Adapter(){
内部类MyViewHolder(视图:视图):RecyclerView.ViewHolder(视图){
...
}
重写CreateViewHolder(父级:ViewGroup,viewType:Int):MyViewHolder{
...
}
覆盖onBindViewHolder(holder:MyViewHolder,位置:Int){
...
holder.simpleCheckedTextView.setOnClickListener{
//破例
(作为活动的上下文)。findViewById(订单按钮)。isEnabled=true
}
}

激活
按钮的最佳方法是什么?是否可以为
RecyclerView
设置侦听器?

可以。您可以创建如下自定义界面:

公共接口RecycleServiceClickListener{
void recycleServiceItemClicked(视图,int位置);
}
在适配器内部:

类AndroidDeviceAdapter(内部变量上下文:上下文,私有val设备:数组):
RecyclerView.Adapter(){
...
私有RecycleWebClickListener RecycleWebClickListener;
...
public void setRecycleWebClickListener(RecycleWebClickListener RecycleWebClickListener)
{
this.recyclerViewClickListener=recyclerViewClickListener;
}
...
然后单击“添加项目侦听器”:

holder.simpleCheckedTextView.setOnClickListener{
RecycleServiceClickListener.RecycleServiceItemClicked(holder.simpleCheckedTextView,getAdapterPosition());
}
然后将侦听器附加到要执行所需操作的活动中


我的一些代码片段是java风格的。与您的kotlin代码结合在一起。请记住对其进行排序并使其适应kotlin。良好的编码

请尝试以下内容

(context as OrderActivity).order_button.isEnabled = true

假设
order\u按钮
OrderActivity

中的一个变量,您可以在
AndroidDeviceAdapter
中定义一个接口,如下所示:

interface MyCheckedTextListener {
    fun onCheckedTextClicked()
}
适配器的构造函数应该采用
MyCheckedTextListener
参数,而不是
Context
参数:

class AndroidDeviceAdapter(internal var checkedTextListener: MyCheckedTextListener,
     private val devices: Array<String>) : RecyclerView.Adapter<MyListAdapter.MyViewHolder>()

因此,
活动
可以设置新的
按钮
状态(并且
按钮
可以保持
私有
和非
静态

尝试将适配器设置为活动的内部类。这样,您就可以访问活动的button变量。或者在将上下文转换为特定活动类后,使用“点”操作员访问该按钮。我假设您的按钮不在“回收器”视图保持架中。请共享您的活动代码。谢谢,在更改为
(上下文为活动)后。order_button.isEnabled=true
如您所建议,我注意到我通过了
applicationContext
(应用程序上下文)而不是
this@OrderActivity
(活动上下文)
override fun onBindViewHolder(holder: MyViewHolder?, position: Int) {
    holder?.simpleCheckedTextView?.setOnClickListener {
        checkedTextListener.onCheckedTextClicked()
    }
}