android - 在 Recyclerview 的适配器中使用 DataBinding 库的点击事件

标签 android android-recyclerview kotlin android-databinding

我是 DataBinding 库的新手,并在 recyclerview 的适配器中使用它。我想在单击 View 时打开另一个 Activity 并向其传递一个 ID。

下面是我的xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <variable
            name="trainingPlanResponse"
            type="xyz.TrainingPlanResponse" />
        <variable
            name="presenter"
            type="xyz.MyPlansAdapter"/>
    </data>
<TextView
    android:id="@+id/tvPlan"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:drawableLeft="@drawable/ic_launcher"
    android:drawableRight="@drawable/arrow_right"
    android:layout_margin="@dimen/dp15"

    android:text="@{trainingPlanResponse.planName}"
    android:onClick="@{presenter.onClick}"
    android:drawablePadding="@dimen/dp5"
    android:textSize="@dimen/sp18"
    android:textColor="@color/black_variant5"
    android:gravity="center_vertical"
    />
</layout>

下面是适配器代码-

class MyPlansAdapter(private val context: Context?, private val list:ArrayList<TrainingPlanResponse> ):RecyclerView.Adapter<MyPlansAdapter.ViewHolder>()
{

    override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
        holder!!.binding!!.setVariable(BR.trainingPlanResponse,list.get(position));
        holder!!.binding!!.setVariable(BR.presenter,this);
//        holder!!.tvPlans.text=list.get(position).planName
    }

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
        val itemView=LayoutInflater.from(context).inflate(R.layout.item_myplans,parent,false);
        return ViewHolder(itemView);
    }

    override fun getItemCount(): Int {
        return list.size
    }

   fun onClick()
    {
        val intent = Intent(context, PlanWeekActivity::class.java)
        context!!.startActivity(intent)
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
    {
//        val tvPlans: TextView
          var  binding: ViewDataBinding?


        init {
            binding = DataBindingUtil.bind(itemView);

        }

    }
}

我尝试使用 xml 中的 onClick 并遇到以下错误-

[kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors. ****/ data binding error ****msg:Listener class android.view.View.OnClickListener with method onClick did not match signature of any method presenter.onClick file:xyz/item_myplans.xml loc:20:23 - 20:39 ****\ data binding error ****

我也无法理解如何将 planId 传递给它? 我的模型是-

class TrainingPlanResponse{
    var planId:String?=null;
var planName:String?=null;
}

最佳答案

您正在尝试为您的 TextView 设置一个 View.OnClickListener。但是语句 presenter.onClick 不应该用于方法引用。相反,您应该使用标准的 Java 表示法 presenter::onClick

onClick() 本身不能用作 View.OnClickListener,因为签名不匹配。从功能上讲,它是 (View)->Unit()->Unit

因此,要么声明 fun onClick(v: View),要么在您的 xml @{v -> presenter.onClick()} 中使用 lambda 表示法。

关于android - 在 Recyclerview 的适配器中使用 DataBinding 库的点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50443241/

相关文章:

android - 防止 RecyclerView 消费触摸事件

java - 如何用起始文本绘制圆弧

java - 在嵌套 Flowable 的 onNext 中抛出异常会导致 UndeliverableException

java - 如何将日期时间转换为日期?

java - RecyclerView 没有调用 onCreateViewHolder 或 onBindView

安卓NDK。如何播放视频。

java - 适用于多种数据类型的 RecyclerView.Adapter

java - 如何避免创建新的 ObjectMapper 实例,每个来自外部系统的类型响应都被 Jackson 接收和解析?

javascript - 如何在 Vue.js 中调用 android 函数?

安卓开发: ddms from command line not seeing devices