From c90a7b0d3ee463cb6ea1d2bf3c02f067c5541b1d Mon Sep 17 00:00:00 2001 From: zhangmengxiong Date: Thu, 30 Mar 2023 08:36:45 +0800 Subject: [PATCH 1/2] Update MXScrollPickerView.kt --- .../mx/adapt/scroller/MXScrollPickerView.kt | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/MXAdapt/src/main/java/com/mx/adapt/scroller/MXScrollPickerView.kt b/MXAdapt/src/main/java/com/mx/adapt/scroller/MXScrollPickerView.kt index 5012b6d..8768db3 100644 --- a/MXAdapt/src/main/java/com/mx/adapt/scroller/MXScrollPickerView.kt +++ b/MXAdapt/src/main/java/com/mx/adapt/scroller/MXScrollPickerView.kt @@ -12,13 +12,13 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearSnapHelper import androidx.recyclerview.widget.RecyclerView import com.mx.adapt.MXBaseSimpleAdapt +import com.mx.adapt.utils.MXUtils import kotlin.math.max class MXScrollPickerView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null ) : RecyclerView(context, attrs) { private val manager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) - private var dashColor: Int? = Color.parseColor("#33999999") private var itemSize = 5 internal val itemOffset: Int get() = (itemSize - 1) / 2 @@ -27,6 +27,10 @@ class MXScrollPickerView @JvmOverloads constructor( private var itemSelect: IMXSelect? = null private val pickerAdapt = MXScrollPickerAdapt(this) + private var dashColor: Int? = Color.parseColor("#33999999") + private val dashPaint = Paint().apply { style = Paint.Style.FILL } + private val dashRectF = RectF() + init { LinearSnapHelper().attachToRecyclerView(this) layoutManager = manager @@ -48,35 +52,31 @@ class MXScrollPickerView @JvmOverloads constructor( viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener { override fun onPreDraw(): Boolean { - pickerAdapt?.notifyDataSetChanged() + MXUtils.log("MXScrollPickerView -> onPreDraw") + pickerAdapt.notifyDataSetChanged() viewTreeObserver.removeOnPreDrawListener(this) return true } }) } - override fun onDraw(c: Canvas?) { - super.onDraw(c) + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) dashColor?.let { dash -> val itemHeight = itemHeight val itemOffset = itemOffset - c?.drawRect( - RectF( - 0f, - itemHeight * itemOffset.toFloat(), - width.toFloat(), - itemHeight * (itemOffset + 1).toFloat() - ), - Paint().apply { - color = dash - style = Paint.Style.FILL - }) + dashPaint.color = dash + dashRectF.left = 0f + dashRectF.right = width.toFloat() + dashRectF.top = itemHeight * itemOffset.toFloat() + dashRectF.bottom = itemHeight * (itemOffset + 1).toFloat() + canvas.drawRect(dashRectF, dashPaint) } } private fun getAllHeight() = height - paddingTop - paddingBottom - fun setDashColor(color: Int) { + fun setDashColor(color: Int?) { dashColor = color postInvalidate() } @@ -85,7 +85,11 @@ class MXScrollPickerView @JvmOverloads constructor( if (size % 2 == 0) { throw Exception("数量不能为双数!") } + if (size < 3) { + throw Exception("最小显示行数为3") + } itemSize = size + postInvalidate() pickerAdapt.notifyDataSetChanged() } @@ -97,7 +101,10 @@ class MXScrollPickerView @JvmOverloads constructor( fun setSelectIndex(index: Int, animation: Boolean = false) { val position = max(0, index) smoothScrollTo(position, animation) - post { smoothScrollTo(position, animation) } + post { + MXUtils.log("MXScrollPickerView -> setSelectIndex") + smoothScrollTo(position, animation) + } } fun setOnSelectListener(listener: IMXSelect?) { @@ -131,11 +138,6 @@ class MXScrollPickerView @JvmOverloads constructor( } } - override fun onAttachedToWindow() { - super.onAttachedToWindow() - - } - private var currentSelectIndex = -1 private fun notifySelectChange(index: Int) { val itemSelect = itemSelect ?: return -- Gitee From 0a9452c8039d30077f66f6c601fbcff143e1ba38 Mon Sep 17 00:00:00 2001 From: zhangmengxiong Date: Thu, 30 Mar 2023 10:40:53 +0800 Subject: [PATCH 2/2] 1.2.6 --- .../mx/adapt/scroller/MXScrollPickerView.kt | 48 ++++++++++++------- README.md | 2 +- .../activity/ScrollerViewActivity.kt | 4 +- build.gradle | 2 +- 4 files changed, 36 insertions(+), 20 deletions(-) diff --git a/MXAdapt/src/main/java/com/mx/adapt/scroller/MXScrollPickerView.kt b/MXAdapt/src/main/java/com/mx/adapt/scroller/MXScrollPickerView.kt index 8768db3..be8a321 100644 --- a/MXAdapt/src/main/java/com/mx/adapt/scroller/MXScrollPickerView.kt +++ b/MXAdapt/src/main/java/com/mx/adapt/scroller/MXScrollPickerView.kt @@ -12,21 +12,23 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearSnapHelper import androidx.recyclerview.widget.RecyclerView import com.mx.adapt.MXBaseSimpleAdapt -import com.mx.adapt.utils.MXUtils import kotlin.math.max class MXScrollPickerView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null ) : RecyclerView(context, attrs) { private val manager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) - private var itemSize = 5 + private val pickerAdapt = MXScrollPickerAdapt(this) + + private var itemSize = 5 // 当前显示几条数据 internal val itemOffset: Int get() = (itemSize - 1) / 2 - internal val itemHeight get() = getAllHeight() / itemSize + internal val itemHeight get() = (getAllHeight() / itemSize) private var itemSelect: IMXSelect? = null - private val pickerAdapt = MXScrollPickerAdapt(this) + private var currentSelectIndex = NO_POSITION + // 中间选中的阴影 private var dashColor: Int? = Color.parseColor("#33999999") private val dashPaint = Paint().apply { style = Paint.Style.FILL } private val dashRectF = RectF() @@ -34,7 +36,7 @@ class MXScrollPickerView @JvmOverloads constructor( init { LinearSnapHelper().attachToRecyclerView(this) layoutManager = manager - adapter = pickerAdapt + super.setAdapter(pickerAdapt) pickerAdapt.setItemClick { position, _ -> smoothScrollTo(position - itemOffset, true) } @@ -52,7 +54,7 @@ class MXScrollPickerView @JvmOverloads constructor( viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener { override fun onPreDraw(): Boolean { - MXUtils.log("MXScrollPickerView -> onPreDraw") + // MXUtils.log("onPreDraw width=$width,height=$height") pickerAdapt.notifyDataSetChanged() viewTreeObserver.removeOnPreDrawListener(this) return true @@ -60,6 +62,11 @@ class MXScrollPickerView @JvmOverloads constructor( }) } + override fun setAdapter(adapter: Adapter<*>?) { +// super.setAdapter(adapter) + throw Exception("Forbidden call func 'setAdapter()'") + } + override fun onDraw(canvas: Canvas) { super.onDraw(canvas) dashColor?.let { dash -> @@ -93,25 +100,33 @@ class MXScrollPickerView @JvmOverloads constructor( pickerAdapt.notifyDataSetChanged() } - fun setAdapt(adapt: MXBaseSimpleAdapt<*>) { - adapt.registerAdapterDataObserver(TypeObserver()) + fun setMXAdapt(adapt: MXBaseSimpleAdapt<*>?) { + pickerAdapt.adapt?.unregisterAdapterDataObserver(adaptObserver) pickerAdapt.adapt = adapt + adapt?.registerAdapterDataObserver(adaptObserver) + pickerAdapt.notifyDataSetChanged() } fun setSelectIndex(index: Int, animation: Boolean = false) { val position = max(0, index) + // MXUtils.log("setSelectIndex") smoothScrollTo(position, animation) post { - MXUtils.log("MXScrollPickerView -> setSelectIndex") smoothScrollTo(position, animation) } } + fun currentSelectIndex(): Int { + return currentSelectIndex + } + fun setOnSelectListener(listener: IMXSelect?) { itemSelect = listener - notifySelectChange(manager.findFirstCompletelyVisibleItemPosition() - itemOffset) + notifySelectChange(manager.findFirstCompletelyVisibleItemPosition()) } + private val adaptObserver = TypeObserver() + private inner class TypeObserver : AdapterDataObserver() { override fun onChanged() { pickerAdapt.notifyDataSetChanged() @@ -138,17 +153,17 @@ class MXScrollPickerView @JvmOverloads constructor( } } - private var currentSelectIndex = -1 private fun notifySelectChange(index: Int) { + if (index < 0 && index != NO_POSITION) return val itemSelect = itemSelect ?: return - val targetIndex = if (index < 0) 0 else index - if (targetIndex == currentSelectIndex) return - currentSelectIndex = targetIndex - itemSelect.onSelect(targetIndex) + if (index == currentSelectIndex) return + currentSelectIndex = index + + // MXUtils.log("notifySelectChange($index)") + itemSelect.onSelect(index) } private fun smoothScrollTo(position: Int, animation: Boolean) { - notifySelectChange(position) if (animation && itemHeight > 0) { val current = manager.findFirstCompletelyVisibleItemPosition() smoothScrollBy( @@ -158,5 +173,6 @@ class MXScrollPickerView @JvmOverloads constructor( } else { manager.scrollToPositionWithOffset(position, 0) } + notifySelectChange(position) } } \ No newline at end of file diff --git a/README.md b/README.md index 05dec2f..a6a3ded 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![](https://jitpack.io/v/com.gitee.zhangmengxiong/MXRecycleAdapt.svg)](https://jitpack.io/#com.gitee.zhangmengxiong/MXRecycleAdapt) ```gradle - implementation 'com.gitee.zhangmengxiong:MXRecycleAdapt:1.2.5' + implementation 'com.gitee.zhangmengxiong:MXRecycleAdapt:1.2.6' ``` #### 介绍 adapt快速开发基类 diff --git a/app/src/main/java/com/mx/recycle_adapt/activity/ScrollerViewActivity.kt b/app/src/main/java/com/mx/recycle_adapt/activity/ScrollerViewActivity.kt index c50391a..e48579c 100644 --- a/app/src/main/java/com/mx/recycle_adapt/activity/ScrollerViewActivity.kt +++ b/app/src/main/java/com/mx/recycle_adapt/activity/ScrollerViewActivity.kt @@ -22,7 +22,7 @@ class ScrollerViewActivity : AppCompatActivity() { adapt.notifyDataSetChanged() scrollerView.setItemSize(5) - scrollerView.setAdapt(adapt) + scrollerView.setMXAdapt(adapt) var currentIndex = 0 scrollerView.setOnSelectListener(object : IMXSelect { @@ -62,7 +62,7 @@ class ScrollerViewActivity : AppCompatActivity() { override fun bindView(position: Int, binding: ViewBinding, record: Int) { binding as AdaptSimpleIndexBinding - binding.indexTxv.text = "" + (record + 1) + binding.indexTxv.text = "" + (record) } } } \ No newline at end of file diff --git a/build.gradle b/build.gradle index 6ba2131..722418d 100644 --- a/build.gradle +++ b/build.gradle @@ -35,5 +35,5 @@ ext { minSdkVersion = 19 versionCode = 1 - versionName = "1.2.5" + versionName = "1.2.6" } \ No newline at end of file -- Gitee