RecyclerViewなどでViewDataBindingを使う時に次のように書くのめんどくさくて。
class ViewHolder(val binding:ListItemCommentBinding) : RecyclerView.ViewHolder(binding.root) override fun onCreateViewHolder(parent: ViewGroup, type: Int) = ViewHolder(ListItemCommentBinding .inflate(LayoutInflater.from(parent.context), parent, false))
こういう感じにViewGroupに関数生やすと、
ViewExtensions.kt
inline fun <reified T : ViewDataBinding> ViewGroup.inflateBinding(): T { return T::class.java .getDeclaredMethod( "inflate", LayoutInflater::class.java, ViewGroup::class.java, Boolean::class.javaPrimitiveType ) .invoke(null, LayoutInflater.from(context), this, false) as T }
良さそう。
override fun onCreateViewHolder(parent: ViewGroup, type: Int) = ViewHolder(parent.inflateBinding())
ViewHolderが複数種類のViewDataBindingを取り扱う場合は型引数が要る。
override fun onCreateViewHolder(parent: ViewGroup, type: Int) = ViewHolder(parent.inflateBinding<ListItemCommentBinding>())
追記 2017/05/23
proguardで死ぬので、使うときは次の設定が必要になります。ひょえ〜
-keep class * extends android.databinding.ViewDataBinding { public static ** inflate(android.view.LayoutInflater, android.view.ViewGroup, boolean); }