Событие клика с использованием библиотеки DataBinding внутри адаптера Recyclerview - PullRequest
0 голосов
/ 21 мая 2018

Я новичок в библиотеке DataBinding и использую ее в адаптере recyclerview. Я хочу открыть другое действие по щелчку представления и передать ему идентификатор.

Ниже мой 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);

        }

    }
}

Я попытался использовать onClick из xml и получить ошибку ниже -

[kapt] Произошло исключение: android.databinding.tool.util.LoggedErrorException: обнаружены ошибки привязки данных.**** / ошибка привязки данных **** msg: класс прослушивателя android.view.View.OnClickListener с методом onClick не соответствует сигнатуре файла метода Presenter.onClick: xyz / item_myplans.xml loc: 20: 23 - 20: 39 **** \ ошибка привязки данных ****

Также я не могу понять, как я передам planId?Моя модель -

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

1 Ответ

0 голосов
/ 21 мая 2018

Вы пытаетесь установить View.OnClickListener на TextView.Но утверждение presenter.onClick не должно использоваться для ссылок на методы.Вместо этого вы должны использовать стандартную Java нотацию presenter::onClick.

Сам onClick() не может использоваться как View.OnClickListener, так как подписи не совпадают.Функционально это (View)->Unit против ()->Unit.

Так что либо объявите fun onClick(v: View), либо используйте лямбда-нотацию в вашем xml @{v -> presenter.onClick()}.

...