From bbaddee2ed4c5f2e534683d9687392d254c37d67 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Wed, 27 Dec 2017 00:16:09 -0500 Subject: Feature/fast adapter (#119) * Update fast adapter implementation * Add repeated click listener --- .../ca/allanwang/kau/adapters/AdapterUtils.kt | 8 +--- .../kau/adapters/RepeatedClickListener.kt | 53 ++++++++++++++++++++++ 2 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 adapter/src/main/kotlin/ca/allanwang/kau/adapters/RepeatedClickListener.kt (limited to 'adapter') diff --git a/adapter/src/main/kotlin/ca/allanwang/kau/adapters/AdapterUtils.kt b/adapter/src/main/kotlin/ca/allanwang/kau/adapters/AdapterUtils.kt index 206c66b..dae2862 100644 --- a/adapter/src/main/kotlin/ca/allanwang/kau/adapters/AdapterUtils.kt +++ b/adapter/src/main/kotlin/ca/allanwang/kau/adapters/AdapterUtils.kt @@ -13,10 +13,4 @@ import com.mikepenz.fastadapter.commons.adapters.FastItemAdapter * Add kotlin's generic syntax to better support out types */ fun > fastAdapter(vararg adapter: IAdapter) = - FastAdapter.with>(adapter.toList())!! - -/** - * Helper to get an [IAdapter] directly from a [FastItemAdapter] - */ -fun > fastAdapter(adapter: IAdapter, fastAdapter: FastItemAdapter) = - fastAdapter(adapter, fastAdapter.itemAdapter) \ No newline at end of file + FastAdapter.with>(adapter.toList())!! \ No newline at end of file diff --git a/adapter/src/main/kotlin/ca/allanwang/kau/adapters/RepeatedClickListener.kt b/adapter/src/main/kotlin/ca/allanwang/kau/adapters/RepeatedClickListener.kt new file mode 100644 index 0000000..d864a55 --- /dev/null +++ b/adapter/src/main/kotlin/ca/allanwang/kau/adapters/RepeatedClickListener.kt @@ -0,0 +1,53 @@ +package ca.allanwang.kau.adapters + +import android.support.annotation.IntRange +import android.view.View +import com.mikepenz.fastadapter.FastAdapter +import com.mikepenz.fastadapter.IAdapter +import com.mikepenz.fastadapter.IItem +import com.mikepenz.fastadapter.listeners.OnClickListener + +/** + * Created by Allan Wang on 26/12/17. + */ +fun > FastAdapter.withOnRepeatedClickListener(count: Int, + duration: Long, + event: OnClickListener) = + withOnClickListener(RepeatedClickListener(count, duration, event)) + +/** + * Registers and skips each click until the designated [count] clicks are triggered, + * each within [duration] from each other. + * Only then will the [event] be fired, and everything will be reset. + */ +private class RepeatedClickListener>( + @IntRange(from = 1) val count: Int, + @IntRange(from = 1) val duration: Long, + val event: OnClickListener) : OnClickListener { + + init { + if (count <= 0) + throw IllegalArgumentException("RepeatedClickListener's count must be > 1") + if (duration <= 0) + throw IllegalArgumentException("RepeatedClickListener's duration must be > 1L") + } + + private var chain = 0 + private var time = -1L + + override fun onClick(v: View, adapter: IAdapter, item: Item, position: Int): Boolean { + val now = System.currentTimeMillis() + if (time - now < duration) + chain++ + else + chain = 0 + time = now + if (chain == count) { + chain = 0 + time = -1 + event.onClick(v, adapter, item, position) + return true + } + return false + } +} \ No newline at end of file -- cgit v1.2.3