diff --git a/app/src/main/java/com/github/nitrico/lastadapter_sample/ui/KotlinListFragment.kt b/app/src/main/java/com/github/nitrico/lastadapter_sample/ui/KotlinListFragment.kt index 127527a..edf19f2 100644 --- a/app/src/main/java/com/github/nitrico/lastadapter_sample/ui/KotlinListFragment.kt +++ b/app/src/main/java/com/github/nitrico/lastadapter_sample/ui/KotlinListFragment.kt @@ -13,39 +13,39 @@ import com.github.nitrico.lastadapter_sample.databinding.* class KotlinListFragment : ListFragment() { private val typeHeader = Type(R.layout.item_header) - .onCreate { println("Created ${it.binding.item} at #${it.adapterPosition}") } - .onBind { println("Bound ${it.binding.item} at #${it.adapterPosition}") } - .onRecycle { println("Recycled ${it.binding.item} at #${it.adapterPosition}") } - .onClick { activity.toast("Clicked #${it.adapterPosition}: ${it.binding.item}") } - .onLongClick { activity.toast("Long-clicked #${it.adapterPosition}: ${it.binding.item}") } + .onCreate { println("Created ${it.binding?.item} at #${it.adapterPosition}") } + .onBind { println("Bound ${it.binding?.item} at #${it.adapterPosition}") } + .onRecycle { println("Recycled ${it.binding?.item} at #${it.adapterPosition}") } + .onClick { activity.toast("Clicked #${it.adapterPosition}: ${it.binding?.item}") } + .onLongClick { activity.toast("Long-clicked #${it.adapterPosition}: ${it.binding?.item}") } private val typeHeaderFirst = Type(R.layout.item_header_first) - .onCreate { println("Created ${it.binding.item} at #${it.adapterPosition}") } - .onBind { println("Bound ${it.binding.item} at #${it.adapterPosition}") } - .onRecycle { println("Recycled ${it.binding.item} at #${it.adapterPosition}") } - .onClick { activity.toast("Clicked #${it.adapterPosition}: ${it.binding.item}") } - .onLongClick { activity.toast("Long-clicked #${it.adapterPosition}: ${it.binding.item}") } + .onCreate { println("Created ${it.binding?.item} at #${it.adapterPosition}") } + .onBind { println("Bound ${it.binding?.item} at #${it.adapterPosition}") } + .onRecycle { println("Recycled ${it.binding?.item} at #${it.adapterPosition}") } + .onClick { activity.toast("Clicked #${it.adapterPosition}: ${it.binding?.item}") } + .onLongClick { activity.toast("Long-clicked #${it.adapterPosition}: ${it.binding?.item}") } private val typePoint = Type(R.layout.item_point) - .onCreate { println("Created ${it.binding.item} at #${it.adapterPosition}") } - .onBind { println("Bound ${it.binding.item} at #${it.adapterPosition}") } - .onRecycle { println("Recycled ${it.binding.item} at #${it.adapterPosition}") } - .onClick { activity.toast("Clicked #${it.adapterPosition}: ${it.binding.item}") } - .onLongClick { activity.toast("Long-clicked #${it.adapterPosition}: ${it.binding.item}") } + .onCreate { println("Created ${it.binding?.item} at #${it.adapterPosition}") } + .onBind { println("Bound ${it.binding?.item} at #${it.adapterPosition}") } + .onRecycle { println("Recycled ${it.binding?.item} at #${it.adapterPosition}") } + .onClick { activity.toast("Clicked #${it.adapterPosition}: ${it.binding?.item}") } + .onLongClick { activity.toast("Long-clicked #${it.adapterPosition}: ${it.binding?.item}") } private val typeCar = Type(R.layout.item_car) - .onCreate { println("Created ${it.binding.item} at #${it.adapterPosition}") } - .onBind { println("Bound ${it.binding.item} at #${it.adapterPosition}") } - .onRecycle { println("Recycled ${it.binding.item} at #${it.adapterPosition}") } - .onClick { activity.toast("Clicked #${it.adapterPosition}: ${it.binding.item}") } - .onLongClick { activity.toast("Long-clicked #${it.adapterPosition}: ${it.binding.item}") } + .onCreate { println("Created ${it.binding?.item} at #${it.adapterPosition}") } + .onBind { println("Bound ${it.binding?.item} at #${it.adapterPosition}") } + .onRecycle { println("Recycled ${it.binding?.item} at #${it.adapterPosition}") } + .onClick { activity.toast("Clicked #${it.adapterPosition}: ${it.binding?.item}") } + .onLongClick { activity.toast("Long-clicked #${it.adapterPosition}: ${it.binding?.item}") } private val typePerson = Type(R.layout.item_person) - .onCreate { println("Created ${it.binding.item} at #${it.adapterPosition}") } - .onBind { println("Bound ${it.binding.item} at #${it.adapterPosition}") } - .onBind { println("Recycled ${it.binding.item} at #${it.adapterPosition}") } - .onClick { activity.toast("Clicked #${it.adapterPosition}: ${it.binding.item}") } - .onLongClick { activity.toast("Long-clicked #${it.adapterPosition}: ${it.binding.item}") } + .onCreate { println("Created ${it.binding?.item} at #${it.adapterPosition}") } + .onBind { println("Bound ${it.binding?.item} at #${it.adapterPosition}") } + .onBind { println("Recycled ${it.binding?.item} at #${it.adapterPosition}") } + .onClick { activity.toast("Clicked #${it.adapterPosition}: ${it.binding?.item}") } + .onLongClick { activity.toast("Long-clicked #${it.adapterPosition}: ${it.binding?.item}") } override fun onActivityCreated(savedInstanceState: Bundle?) { @@ -73,18 +73,18 @@ class KotlinListFragment : ListFragment() { .map(R.layout.item_header) .map(typePoint) .map(Type(R.layout.item_car) - .onCreate { println("Created ${it.binding.item} at #${it.adapterPosition}") } - .onBind { println("Bound ${it.binding.item} at #${it.adapterPosition}") } - .onRecycle { println("Recycled ${it.binding.item} at #${it.adapterPosition}") } - .onClick { activity.toast("Clicked #${it.adapterPosition}: ${it.binding.item}") } - .onLongClick { activity.toast("Long-clicked #${it.adapterPosition}: ${it.binding.item}") } + .onCreate { println("Created ${it.binding?.item} at #${it.adapterPosition}") } + .onBind { println("Bound ${it.binding?.item} at #${it.adapterPosition}") } + .onRecycle { println("Recycled ${it.binding?.item} at #${it.adapterPosition}") } + .onClick { activity.toast("Clicked #${it.adapterPosition}: ${it.binding?.item}") } + .onLongClick { activity.toast("Long-clicked #${it.adapterPosition}: ${it.binding?.item}") } ) .map(R.layout.item_person) { - onCreate { println("Created ${it.binding.item} at #${it.adapterPosition}") } - onBind { println("Bound ${it.binding.item} at #${it.adapterPosition}") } - onRecycle { println("Recycled ${it.binding.item} at #${it.adapterPosition}") } - onClick { activity.toast("Clicked #${it.adapterPosition}: ${it.binding.item}") } - onLongClick { activity.toast("Long-clicked #${it.adapterPosition}: ${it.binding.item}") } + onCreate { println("Created ${it.binding?.item} at #${it.adapterPosition}") } + onBind { println("Bound ${it.binding?.item} at #${it.adapterPosition}") } + onRecycle { println("Recycled ${it.binding?.item} at #${it.adapterPosition}") } + onClick { activity.toast("Clicked #${it.adapterPosition}: ${it.binding?.item}") } + onLongClick { activity.toast("Long-clicked #${it.adapterPosition}: ${it.binding?.item}") } } .into(list) } diff --git a/build.gradle b/build.gradle index bcb0670..91ab58a 100644 --- a/build.gradle +++ b/build.gradle @@ -3,8 +3,8 @@ buildscript { sdkMin : 14, sdkTarget : 27, buildTools : '27.0.1', - gradlePlugin : '3.0.1', - kotlin : '1.2.0', + gradlePlugin : '3.1.0-alpha06', + kotlin : '1.2.10', support : '27.0.2' ] repositories { diff --git a/gradle.properties b/gradle.properties index fd3204b..7d9ee0e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,3 +18,4 @@ # org.gradle.parallel=true org.gradle.jvmargs=-Xmx2048m +android.databinding.enableV2=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d009205..272dc62 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.3.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/lastadapter/build.gradle b/lastadapter/build.gradle index 5363063..2a1b2dd 100644 --- a/lastadapter/build.gradle +++ b/lastadapter/build.gradle @@ -1,6 +1,7 @@ plugins { id 'com.android.library' id 'kotlin-android' + id 'kotlin-kapt' } android { @@ -10,7 +11,18 @@ android { dataBinding.enabled true } +afterEvaluate { + android.libraryVariants.all { + def name = it.name.capitalize() + tasks["kapt${name}Kotlin"].dependsOn("transformDataBindingWithDataBindingMergeArtifactsFor${name}") + + } +} + + dependencies { + //Data binding + kapt "com.android.databinding:compiler:$versions.gradlePlugin" compile "com.android.support:recyclerview-v7:$versions.support" compile "org.jetbrains.kotlin:kotlin-stdlib:$versions.kotlin" } diff --git a/lastadapter/src/main/java/com/github/nitrico/lastadapter/Holder.kt b/lastadapter/src/main/java/com/github/nitrico/lastadapter/Holder.kt index edce49e..0534be3 100644 --- a/lastadapter/src/main/java/com/github/nitrico/lastadapter/Holder.kt +++ b/lastadapter/src/main/java/com/github/nitrico/lastadapter/Holder.kt @@ -19,6 +19,6 @@ package com.github.nitrico.lastadapter import android.databinding.ViewDataBinding import android.support.v7.widget.RecyclerView -open class Holder(val binding: B) : RecyclerView.ViewHolder(binding.root) { +open class Holder(val binding: B?) : RecyclerView.ViewHolder(binding?.root) { internal var created = false } diff --git a/lastadapter/src/main/java/com/github/nitrico/lastadapter/LastAdapter.kt b/lastadapter/src/main/java/com/github/nitrico/lastadapter/LastAdapter.kt index e6cc38e..bebfa39 100644 --- a/lastadapter/src/main/java/com/github/nitrico/lastadapter/LastAdapter.kt +++ b/lastadapter/src/main/java/com/github/nitrico/lastadapter/LastAdapter.kt @@ -35,7 +35,7 @@ class LastAdapter(private val list: List, private val DATA_INVALIDATION = Any() private val callback = ObservableListCallback(this) private var recyclerView: RecyclerView? = null - private var inflater: LayoutInflater? = null + private lateinit var inflater: LayoutInflater private val map = mutableMapOf, BaseType>() private var layoutHandler: LayoutHandler? = null @@ -90,7 +90,7 @@ class LastAdapter(private val list: List, override fun onCreateViewHolder(view: ViewGroup, viewType: Int): Holder { val binding = DataBindingUtil.inflate(inflater, viewType, view, false) val holder = Holder(binding) - binding.addOnRebindCallback(object : OnRebindCallback() { + binding?.addOnRebindCallback(object : OnRebindCallback() { override fun onPreBind(binding: ViewDataBinding) = recyclerView?.isComputingLayout ?: false override fun onCanceled(binding: ViewDataBinding) { if (recyclerView?.isComputingLayout ?: true) { @@ -107,8 +107,8 @@ class LastAdapter(private val list: List, override fun onBindViewHolder(holder: Holder, position: Int) { val type = getType(position)!! - holder.binding.setVariable(getVariable(type), list[position]) - holder.binding.executePendingBindings() + holder.binding?.setVariable(getVariable(type), list[position]) + holder.binding?.executePendingBindings() @Suppress("UNCHECKED_CAST") if (type is AbsType<*>) { if (!holder.created) { @@ -120,7 +120,7 @@ class LastAdapter(private val list: List, override fun onBindViewHolder(holder: Holder, position: Int, payloads: List) { if (isForDataBinding(payloads)) { - holder.binding.executePendingBindings() + holder.binding?.executePendingBindings() } else { super.onBindViewHolder(holder, position, payloads) }