Room Embedding @Embedded

Something I just discovered is that @Embedded‚Äč fields in Room entities can themselves contain @Embedded fields. For example:

data class Post(
    @Embedded
    val media: Media
)

data class Media(
    @Embedded
    val metadata: Metadata
)

data class Metadata(
    val resolution: String
)

works as you would expect, with resolution being pulled up to the Post entity table. Not sure how deeply @Embedded you can go, or if there are any performance consequences to this, but a neat trick!

Kotlin Android Extensions with ViewHolders

Something I recently discovered is how easy it is to use Kotlin’s Android View extensions with RecyclerView ViewHolders. Previously using Butterknife, many of my ViewHolder classes were simply a bunch of @BindViews with an init { ButterKnife.bind } . With Kotlin Android extensions, the views are declared as extensions on the ViewHolder’s ItemView field. Additionally, instead of declaring a ViewHolder class with one line, you can actually just use an anonymous object in your onCreateViewHolder method.

You could potentially use any of Kotlin’s scoping extension functions, I prefer to use let, so here’s what that looks like (note also the this[...] notation) :

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
        object : RecyclerView.ViewHolder(
            context.inflate(R.layout.adapter_thread, parent)
        ) {}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val item = this[position]
    holder.itemView.let {
        it.viewIdTitle = item.title
        it.viewIdDescription = item.description
    }
}