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 5012b6da64d9b382d4ca5523ffe8afaa798c2788..be8a321151704baa7ed95a182c520fbf91241434 100644 --- a/MXAdapt/src/main/java/com/mx/adapt/scroller/MXScrollPickerView.kt +++ b/MXAdapt/src/main/java/com/mx/adapt/scroller/MXScrollPickerView.kt @@ -18,19 +18,25 @@ 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 + 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() init { LinearSnapHelper().attachToRecyclerView(this) layoutManager = manager - adapter = pickerAdapt + super.setAdapter(pickerAdapt) pickerAdapt.setItemClick { position, _ -> smoothScrollTo(position - itemOffset, true) } @@ -48,35 +54,36 @@ class MXScrollPickerView @JvmOverloads constructor( viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener { override fun onPreDraw(): Boolean { - pickerAdapt?.notifyDataSetChanged() + // MXUtils.log("onPreDraw width=$width,height=$height") + pickerAdapt.notifyDataSetChanged() viewTreeObserver.removeOnPreDrawListener(this) return true } }) } - override fun onDraw(c: Canvas?) { - super.onDraw(c) + 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 -> 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,26 +92,41 @@ class MXScrollPickerView @JvmOverloads constructor( if (size % 2 == 0) { throw Exception("数量不能为双数!") } + if (size < 3) { + throw Exception("最小显示行数为3") + } itemSize = size + postInvalidate() 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 { smoothScrollTo(position, animation) } + post { + 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() @@ -131,22 +153,17 @@ class MXScrollPickerView @JvmOverloads constructor( } } - override fun onAttachedToWindow() { - super.onAttachedToWindow() - - } - - 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( @@ -156,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 05dec2fb70625f590370c8359c4d2eedfb850ae8..a6a3ded699736407dfa14ea3e5c27033fb4eac6e 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 c50391a677bdbe686d939af241453c1ee2c8c980..e48579c35ee7bc369b373acd92558c8d56efdd6d 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 6ba2131d74e877810a7ffbddbbe728df98813588..722418d9eb56be08bf3b12eef84483f1dbe96ee1 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