在Kotlin中替换Java通用接口以进行数据绑定

时间:2017-04-18 16:16:27

标签: android kotlin android-databinding

我开始认识Kotlin是一名Android开发人员。在制作Android应用程序时,我习惯使用Databinding,retrolambda等。现在我在如何解决Kotlin中的以下案例时有点迷失。

我通常如何在java

中执行此操作

我有一个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

中尝试这样做的

如上所述,我正在尝试与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函数

1 个答案:

答案 0 :(得分:1)

您可以在课程中使用某种方法,例如onSomeClick(),并将其称为:android:onClick="@{onSomeClick}"