Skip to content

Commit

Permalink
* fix click throttle
Browse files Browse the repository at this point in the history
  • Loading branch information
angcyo committed May 27, 2022
1 parent 4640744 commit 06d0b64
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 4 deletions.
40 changes: 37 additions & 3 deletions Adapter/src/main/java/com/angcyo/dsladapter/DslAdapterItem.kt
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ open class DslAdapterItem : LifecycleOwner {

/**占满宽度的item*/
const val FULL_ITEM = -1

/**节流间隔时长*/
var DEFAULT_THROTTLE_INTERVAL = ThrottleClickListener.DEFAULT_THROTTLE_INTERVAL
}

/**适配器, 自动赋值[com.angcyo.dsladapter.DslAdapter.onBindViewHolder]*/
Expand All @@ -80,7 +83,10 @@ open class DslAdapterItem : LifecycleOwner {
/**[com.angcyo.dsladapter.DslAdapter.notifyItemChanged]*/
open fun updateAdapterItem(payload: Any? = PAYLOAD_UPDATE_PART, useFilterList: Boolean = true) {
if (itemDslAdapter?._recyclerView?.isComputingLayout == true) {
L.w("跳过操作! [RecyclerView]正在计算布局.")
//L.w("跳过操作! [RecyclerView]正在计算布局, 请不要在RecyclerView正在布局时, 更新Item. ")
itemDslAdapter?._recyclerView?.post {
updateAdapterItem(payload, useFilterList)
}
return
}
itemDslAdapter?.notifyItemChanged(this, payload, useFilterList).elseNull {
Expand Down Expand Up @@ -258,6 +264,9 @@ open class DslAdapterItem : LifecycleOwner {

var itemLongClick: ((View) -> Boolean)? = null

/**点击节流间隔时长*/
var itemClickThrottleInterval: Long = DEFAULT_THROTTLE_INTERVAL

//使用节流方式处理点击事件
var _clickListener: View.OnClickListener? = ThrottleClickListener(action = { view ->
notNull(itemClick, view) {
Expand Down Expand Up @@ -418,10 +427,14 @@ open class DslAdapterItem : LifecycleOwner {

//初始化事件
open fun _initItemListener(itemHolder: DslViewHolder) {
if (itemClick == null || _clickListener == null || !itemEnable) {
val clickListener = _clickListener
if (itemClick == null || clickListener == null || !itemEnable) {
itemHolder.itemView.isClickable = false
} else {
itemHolder.clickItem(_clickListener)
if (clickListener is ThrottleClickListener) {
clickListener.throttleInterval = itemClickThrottleInterval
}
itemHolder.clickItem(clickListener)
}

if (itemLongClick == null || _longClickListener == null || !itemEnable) {
Expand Down Expand Up @@ -1193,6 +1206,27 @@ open class DslAdapterItem : LifecycleOwner {

/**是否选中, 需要 [ItemSelectorHelper.selectorModel] 的支持. */
var itemIsSelected = false
set(value) {
field = value
onSetItemSelected(value)
}

/**简单的互斥操作支持
* [onSetItemSelected]*/
var itemSingleSelectMutex: Boolean = false

/**选中状态改变回调*/
open fun onSetItemSelected(select: Boolean) {
if (select && itemSingleSelectMutex) {
itemDslAdapter?.eachItem { index, dslAdapterItem ->
if (dslAdapterItem.className() == this.className() && dslAdapterItem != this) {
//互斥操作
dslAdapterItem.itemIsSelected = false
dslAdapterItem.updateAdapterItem()
}
}
}
}

/**是否 允许被选中*/
var isItemCanSelected: (fromSelector: Boolean, toSelector: Boolean) -> Boolean =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import com.angcyo.dsladapter.internal.ThrottleClickListener.Companion.DEFAULT_TH
* @date 2020/01/06
*/
open class ThrottleClickListener(
val throttleInterval: Long = DEFAULT_THROTTLE_INTERVAL,
var throttleInterval: Long = DEFAULT_THROTTLE_INTERVAL,
val throttle: (lastTime: Long, nowTime: Long, view: View) -> Boolean = { lastTime, nowTime, _ ->
(nowTime - lastTime) < throttleInterval
},
Expand Down

0 comments on commit 06d0b64

Please sign in to comment.