Skip to content

Instantly share code, notes, and snippets.

View albodelu's full-sized avatar

Al B. albodelu

View GitHub Profile
@albodelu
albodelu / BindingAdapter.kt
Created September 21, 2017 04:57 — forked from Atternatt/BindingAdapter.kt
Binding Adapters
//forma clásica extrapolada directamente de java
//funcion estatica donde el primer parámetro es la vista y los n siguientes los especificados por le BindingAdapter
@BindingAdapter("bind:url")
fun loadUrl(imageView: ImageView, url: String) {
Picasso.with(imageView.ctx).load(url).transform(CircleTransform()).into(imageView)
}
//opción alternativa
@BindingAdapter("bind:url")
fun ImageView.loadUrl(url: String) {
@albodelu
albodelu / Synchronization.kt
Created September 21, 2017 04:57 — forked from Atternatt/Synchronization.kt
Databinding
//primera opción extener una funcin sobre [BaseObservable] que emita una [ObservableProperty] que emite el cambio y lo notifica
// a los databinders para repintar
inline fun <Param> BaseObservable.bindingParam(initialValue: Param,
crossinline afterChange: (Param) -> Unit): ReadWriteProperty<BaseObservable, Param> =
object : ObservableProperty<Param>(initialValue) {
override fun afterChange(property: KProperty<*>, oldValue: Param, newValue: Param) {
if (oldValue != newValue) {
[email protected]()
class Database(private context: Context) {
val helper: SQLiteOpenHelper by lazy { SQLiteOpenHelper(context,...-) }
val observableProperty: Int by Delegates.observable { thisRef , newValue , oldValue -> doSomething()}
val vetoableProperty: Int by Delegates.vetoable { _ , newValue , oldValue -> return if (oldValue < newValue) true else false }
}
@albodelu
albodelu / ByDouble.kt
Created September 21, 2017 04:56 — forked from Atternatt/ByDouble.kt
Kotlin Delegation Example
class ByDouble(incrementer: Incrementer) : Incrementer by incrementer {
override fun increment(number: Int): Int {
return super.increment(number) * 2
}
}
import android.databinding.Observable as DataBindingObservable
private inline fun <reified T : DataBindingObservable, R : Any?> T.observe(
crossinline block: (T) -> R
): Observable<R> = create { subscriber ->
object : android.databinding.Observable.OnPropertyChangedCallback() {
override fun onPropertyChanged(observable: DataBindingObservable, id: Int) = try {
subscriber.onNext(block(observable as T))
} catch (e: Exception) {
subscriber.onError(e)
@albodelu
albodelu / Examples.kt
Created September 21, 2017 04:56 — forked from Atternatt/Examples.kt
inline, reified, infix
inline fun <reified NewActivity : Activity> Activity.start(bundle: Bundle? = null) {
val intent: Intent = Intent(this, NewActivity::class.java)
bundle?.let { intent.putExtras(it) }
this.startActivity(intent)
}
startActivity<MainActivity>()
infix fun <Value>Boolean.then(block: () -> Value) {
@albodelu
albodelu / Composed.kt
Created September 21, 2017 04:56 — forked from Atternatt/Composed.kt
Functionalize!
fun twice(int: Int) = int * 2
fun trice(int: Int) = int * 3
fun getString(int: Int) = int.toString()
//el operador rangeTo es el '..' acepta un parametro de entrada y otro de salida
//si usamos mónadas para enlazarlo podemos concatenar la salida de uno con la entrada del otro
operator fun <T,R,V> ((T)->R).rangeTo(other: ((R)->V)): ((T)->V){
return {
other(this(it))
}
@albodelu
albodelu / StringExample.kt
Created September 21, 2017 04:56 — forked from Atternatt/StringExample.kt
Operator Overloading
operator fun String.get(intRange: IntRange): String {
return this.substring(intRange)
}
val firstSentence = "hello Marc!"
val secondSentence = "World Wide"
val mixedSentence = firstSentence[0..4] + secondSentence[0..4]
//Hello World
@albodelu
albodelu / OtherExamples.kt
Created September 21, 2017 04:55 — forked from Atternatt/OtherExamples.kt
Kotlin Extension Usages
bundle?.let { intent.putExtras(it) } //si el bundle no es null, lo añadimos como extra al intent
//crear un animationSet al estilo builder
val animationSet = AnimatorSet().apply {
playTogether(animX, animY)
duration = 350
interpolator = FolioBounceInterpolator()
}.start()
fun <T : Comparable<T>> List<T>.sort() {
Collections.sort(this)
}
list.sort();
val index = list.binarySearch(x);
val