我开始认识Kotlin是一名Android开发人员。在制作Android应用程序时,我习惯使用Databinding,retrolambda等。现在我在如何解决Kotlin中的以下案例时有点迷失。
我有一个Adapter
(扩展RecyclerView.Adapter
),显示RecyclerView
的{{1}}列表BluetoothDevice
。通常,我的所有项目都有一个通用接口TypedClickListener,它将返回用户单击的listitem的T对象。像这样:
通用界面:
public interface TypedClickListener<T> {
void onClick(T t);
}
PairedDeviceAdapter的构造函数
public PairedDeviceAdapter(Context context, BluetoothDevice[] devices, TypedClickHandler<BluetoothDevice> handler){
mContext = context;
mDevices = devices
mClickHandler = handler;
}
适配器的onBindViewHolder :(持有者包含数据绑定布局)
public void onBindViewHolder(DatabindViewHolder holder, Int position) {
holder.getBinding().setVariable(BR.device, mDevices[position]);
holder.getBinding().setVariable(BR.handler, mClickHandler);
}
布局本身:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="android.bluetooth.BluetoothDevice"/>
<import type="com.example.TypedClickHandler"/>
<variable
name="device"
type="BluetoothDevice"/>
<variable
name="handler"
type="TypedClickHandler"/>
</data>
<LinearLayout
... // width, height, etc
android:onClick="@{v->handler.onClick(device)}">
... // Row layout etc
</LinearLayout>
</layout>
现在,把所有东西放在一起:
将TypedClickListener传递给活动中的适配器:
mAdapter = PairedDeviceAdapter(this, devices, (bluetoothDevice) -> {
// The code that is ran when user clicks a device
}
如上所述,我正在尝试与Kotlin这样做。我似乎可以跳过拥有TypedClickListener
的步骤,因为我可以使用简单的内联函数(BluetoothDevice) -> Unit
。
PairedDeviceAdapter如下所示:
class PairedDeviceAdapter(val context: Context, val clickHandler : (BluetoothDevice) -> Unit ) : RecyclerView.Adapter<DatabindViewHolder>() {
onBindViewHolder看起来与它的Java版本相同。但是,我无法弄清楚如何将我的布局绑定到clickhandler,因为我没有clickhandler的类型。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="android.bluetooth.BluetoothDevice"/>
<import type="???"/>
<variable
name="device"
type="BluetoothDevice"/>
<variable
name="handler"
type="???"/>
</data>
<LinearLayout
...
android:onClick="@{v->handler.???(device)}">
... // close everything
如何在Kotlin中创建相同的结构,还是有另一种(更聪明的?)解决方案将适配器 - 行 - 单击绑定到Activity
(或Fragment
)中定义的lambda函数
答案 0 :(得分:1)
您可以在课程中使用某种方法,例如onSomeClick()
,并将其称为:android:onClick="@{onSomeClick}"