I solved this problem with: BindingAdapter and Lambda
1️⃣ ➖ implement CustomView with lambda getter function onItemClick
class CustomView(
context: Context,
attrs: AttributeSet
) : View(context, attrs) {
fun onItemClick(block: () -> Unit) {
block() |or| block.invoke()
}
2️⃣ ➖ add data binding and kapt in build.gradle(:app)
plugins {
id 'kotlin-kapt'
}
android {
...
buildFeatures {
dataBinding = true
}
...
}
3️⃣ ➖ implement BindingAdapter
@BindingAdapter("onItemClick")
fun CustomView.onItemClick(block: () -> Unit) {
this.onItemClick(block)
}
4️⃣ ➖ use BindingAdapter
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="activityMain"
type="com.veldan.MainActivity" />
</data>
<com.veldan.CustomView
android:id="@+id/recycle"
android:layout_width="match_parent"
android:layout_height="match_parent"
onItemClick="@{() -> activityMain.onItemClick()}" />
</layout>
5️⃣ ➖ activity binding
class MainActivity : AppCompatActivity() {
private val TAG = this::class.simpleName
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater).also {
it.activityMain = this
setContentView(it.root)
}
}
fun onItemClick() {
Log.i(TAG, "onItemClick: ")
}