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

时间:2018-11-07 20:03:28

标签: android android-recyclerview kotlin

在我的MainActivity上有一个ButtonRecyclerView,带有CheckedTextView的适配器。

我想在点击Button时启用CheckedTextView

我可以通过将Button上下文设置为static来实现它,但这不是很好(内存泄漏等)

我试图从context获取按钮并在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
        }
    }

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

3 个答案:

答案 0 :(得分:1)

是的,有可能。您可以创建一个这样的自定义界面:

public interface RecyclerViewClickListener {
    void recyclerViewItemClicked(View view, int position);
}

并在您的适配器内部:

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

   ...
   private RecyclerViewClickListener recyclerViewClickListener;
   ...

   public void setRecyclerViewClickListener(RecyclerViewClickListener recyclerViewClickListener)
   {
   this.recyclerViewClickListener=recyclerViewClickListener;
   }
   ...

然后添加项目点击监听器:

 holder.simpleCheckedTextView.setOnClickListener {

        recyclerViewClickListener.recyclerViewItemClicked(holder.simpleCheckedTextView, getAdapterPosition());
        }

然后将侦听器附加到要执行所需动作的活动中。

我的一些代码片段都是Java风格的。与您的Kotlin代码结合在一起的地方。请记住要排序并使其适应Kotlin。良好的编码

答案 1 :(得分:0)

请尝试以下操作。

(context as OrderActivity).order_button.isEnabled = true

假设order_button是您的OrderActivity中的变量。

答案 2 :(得分:0)

您可以在function amIAWeekend(someDate){ return someDate.getDay() == 6 || someDate.getDay() == 0; } 内定义一个接口,如下所示:

AndroidDeviceAdapter

适配器的构造函数应该使用interface MyCheckedTextListener { fun onCheckedTextClicked() } 参数来代替Context参数:

MyCheckedTextListener

实例化适配器时,class AndroidDeviceAdapter(internal var checkedTextListener: MyCheckedTextListener, private val devices: Array<String>) : RecyclerView.Adapter<MyListAdapter.MyViewHolder>() 必须传入Activity的实例。

适配器将通过以下实例通知MyCheckedTextListener

Activity

因此override fun onBindViewHolder(holder: MyViewHolder?, position: Int) { holder?.simpleCheckedTextView?.setOnClickListener { checkedTextListener.onCheckedTextClicked() } } 可以设置新的Activity状态(而Button可以保持Button而不是private