2 Ways to Implement Binding Adapters

One way is using function parameter and another way is using extension function.

ยท

2 min read

2 Ways to Implement Binding Adapters

There could be more than 2 ways to implement binding adapters, but this is what I know. Let's look at what binding adapters are first.

What is Binding Adapters?

Binding adapter is used for implementing custom attribute in your layout file. For example, instead of using the defaultandroid:text attribute, you want to customize it by creating a new attribute app:customText.

Default Attribute - android:text

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!"/>

Custom Attribute - app:customText

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:customText="@{`Hello World!`}"/>

To implement custom attribute, we use binding adapters. Binding adapter is part of the data binding library. So you need to enable data binding in your build.gradle module file.

android {
    ...
    buildFeatures {
        dataBinding true
    }
}

To implement a binding adapter, you need to annotate the function with @BindingAdapter("attribute name here") together with View class that you want to bind to. It can be done by passing the View class (e.g. TextView) as a function parameter or using the extension function.

1. Pass View as Function Parameter

I am not sure if this is a standard way (or maybe a recommended way?) but this is in the official documentation. What I learned initially is the second method below (i.e. using the extension function)

@BindingAdapter("customText")
fun setCustomText(view:TextView, item: String) {
    view.text = "My Custom String: $item"
}

2. Use View Extension Function

@BindingAdapter("customText")
fun TextView.setCustomText(item: String) {
    text = "My Custom String: $item"
}

Because this is an extension function, you can call it in code directly like this.

binding.textView.setCustomText("Hello World!")

You can do that with the first method too, but the second method is more readable.

Personally

I prefer the second method, use the extension function to implement binding adapter. It reflects the actual intention, which is to extend theTextView functionality.

Did you find this article valuable?

Support Vincent Tsen by becoming a sponsor. Any amount is appreciated!

ย