Kotlin如何将参数传递给Adapter中的onClick函数给ViewHolder?
Kotlin how pass parameter to funcion onClick in Adapter to ViewHolder?
我有一个适配器:
class TripsAdapter(
onClickButtonAction: (TripId : Int) -> Unit,
): ListAdapter<Trip, TripssViewHolder>(TripsDiffCallBack()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TripssViewHolder {
return TripsViewHolder(
ItemsTripsBinding.inflate(
LayoutInflater.from(parent.context), parent, false), parent.context)
}
override fun onBindViewHolder(holder: TripsViewHolder, position: Int) {
holder.bind(getItem(position), onClickButtonAction ) <-- here I don't know how pass this function to ViewHolder
}
}
这里是 ViewHolder 中的绑定函数:
fun bind(trip: Trip, onClickButtonAction : (Trip: Int) -> Unit) <- here is wrong code I think{
// And here I want to reaact on button click and pass ID to fragment like this:
binding.button.setOnClickListener{
onClickButtonAction.invoke()
}
}
我想像这样在 Fragment 中接收它:
TripsAdapter = TripsAdapter(onClickButtonAction = { id ->
do magic :P
})
是否可以像funciton一样传递这个ID?我不想使用界面。我想将点击时的 Id 从 ViewHolder 传递给 Fragment。
您可以将方法作为 lambda 作为回调传递。因为它是一个回调,所以它应该是全局的,所以你不必进一步将它传递给 ViewHolder
。您还需要将 lambda 声明为 val
以便您可以在 class.
中访问它
我在下面创建了一个示例。
class TripAdapter(val onClickButtonAction: (trip : Trip, view:View?) -> Unit) : ListAdapter<Trip, TripAdapter.TripsViewHolder>(TripsDiffCallBack) {
inner class TripsViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind(trip: Trip) {
binding.button.setOnClickListener {
onClickButtonAction(trip, it)
}
}
}
}
这就是您的 lambda 的外观 我已经更改了参数以防万一。传递 Trip
的整个对象并传递被点击的 View
这有助于处理多个视图的点击。
现在,无论您在哪里使用此适配器,都可以按如下方式创建它:-
val adapter = TripAdapter(::onTripClickListener)
private fun onTripClickListener(trip:Trip, view: View?){
}
我有一个适配器:
class TripsAdapter(
onClickButtonAction: (TripId : Int) -> Unit,
): ListAdapter<Trip, TripssViewHolder>(TripsDiffCallBack()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TripssViewHolder {
return TripsViewHolder(
ItemsTripsBinding.inflate(
LayoutInflater.from(parent.context), parent, false), parent.context)
}
override fun onBindViewHolder(holder: TripsViewHolder, position: Int) {
holder.bind(getItem(position), onClickButtonAction ) <-- here I don't know how pass this function to ViewHolder
}
}
这里是 ViewHolder 中的绑定函数:
fun bind(trip: Trip, onClickButtonAction : (Trip: Int) -> Unit) <- here is wrong code I think{
// And here I want to reaact on button click and pass ID to fragment like this:
binding.button.setOnClickListener{
onClickButtonAction.invoke()
}
}
我想像这样在 Fragment 中接收它:
TripsAdapter = TripsAdapter(onClickButtonAction = { id ->
do magic :P
})
是否可以像funciton一样传递这个ID?我不想使用界面。我想将点击时的 Id 从 ViewHolder 传递给 Fragment。
您可以将方法作为 lambda 作为回调传递。因为它是一个回调,所以它应该是全局的,所以你不必进一步将它传递给 ViewHolder
。您还需要将 lambda 声明为 val
以便您可以在 class.
我在下面创建了一个示例。
class TripAdapter(val onClickButtonAction: (trip : Trip, view:View?) -> Unit) : ListAdapter<Trip, TripAdapter.TripsViewHolder>(TripsDiffCallBack) {
inner class TripsViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bind(trip: Trip) {
binding.button.setOnClickListener {
onClickButtonAction(trip, it)
}
}
}
}
这就是您的 lambda 的外观 我已经更改了参数以防万一。传递 Trip
的整个对象并传递被点击的 View
这有助于处理多个视图的点击。
现在,无论您在哪里使用此适配器,都可以按如下方式创建它:-
val adapter = TripAdapter(::onTripClickListener)
private fun onTripClickListener(trip:Trip, view: View?){
}