forked from GitHub-Mirror/riotX-android
45 lines
1.3 KiB
Kotlin
45 lines
1.3 KiB
Kotlin
package im.vector.riotredesign.core.helpers
|
|
|
|
import android.view.View
|
|
import com.airbnb.epoxy.EpoxyHolder
|
|
import kotlin.properties.ReadOnlyProperty
|
|
import kotlin.reflect.KProperty
|
|
|
|
/**
|
|
* A pattern for easier view binding with an [EpoxyHolder]
|
|
*
|
|
* See [SampleKotlinModelWithHolder] for a usage example.
|
|
*/
|
|
abstract class KotlinEpoxyHolder : EpoxyHolder() {
|
|
private lateinit var view: View
|
|
|
|
override fun bindView(itemView: View) {
|
|
view = itemView
|
|
}
|
|
|
|
protected fun <V : View> bind(id: Int): ReadOnlyProperty<KotlinEpoxyHolder, V> =
|
|
Lazy { holder: KotlinEpoxyHolder, prop ->
|
|
holder.view.findViewById(id) as V?
|
|
?: throw IllegalStateException("View ID $id for '${prop.name}' not found.")
|
|
}
|
|
|
|
/**
|
|
* Taken from Kotterknife.
|
|
* https://github.com/JakeWharton/kotterknife
|
|
*/
|
|
private class Lazy<V>(
|
|
private val initializer: (KotlinEpoxyHolder, KProperty<*>) -> V
|
|
) : ReadOnlyProperty<KotlinEpoxyHolder, V> {
|
|
private object EMPTY
|
|
|
|
private var value: Any? = EMPTY
|
|
|
|
override fun getValue(thisRef: KotlinEpoxyHolder, property: KProperty<*>): V {
|
|
if (value == EMPTY) {
|
|
value = initializer(thisRef, property)
|
|
}
|
|
@Suppress("UNCHECKED_CAST")
|
|
return value as V
|
|
}
|
|
}
|
|
} |