Home

Awesome

kotlin-anko-observable

A set of extension functions that use features from both kotlin-anko and kotlin-observable.

There are two primary things this repository is for: adapters and data binding.

Data Binding

A collection of extension functions on various views that makes it so a view can reflect a piece of data correctly at all times, and even have the view modify the data.

//Declare an observable property
val textObs = StandardObservableProperty("Start Text")

//later on in your Anko
editText {
  styleDefault()

  //This ensures that the value of the observable and the text inside this EditText are always the same.
  //If textObs changes, so does this.  If this EditText changes, so does textObs.
  bindString(textObs)
}.lparams(matchParent, wrapContent) { margin = dip(8) }

textView {
  //Always shows the value of textObs, updating the view when needed.
  bindString(textObs)
}.lparams(matchParent, wrapContent) { margin = dip(8) }

textView {
  //Equivalent to the above without using the convenience function
  lifecycle.bind(textObs){ it ->
    text = it
  }
}.lparams(matchParent, wrapContent) { margin = dip(8) }

Adapters

This library makes the creation of adapters in Anko WAY easier by using observables. Here's an example:

verticalRecyclerView {
  //Create and use an adapter using the list `items`.
  adapter = listAdapter(items) { loadingObs ->
  
    //Create the view used for each item
    textView {
      gravity = Gravity.CENTER
      textSize = 18f
      minimumHeight = dip(40)
      backgroundResource = selectableItemBackgroundResource

      //updates the text in this TextView when the item changes
      lifecycle.bind(loadingObs){ item ->
        text = item.toString()
      }

      onLongClick {
        items.removeAt(loadingObs.position)
        true
      }
    }.lparams(matchParent, wrapContent)
  }
}