diff --git a/MXAdapt/src/main/java/com/mx/adapt/picker/MXScrollPickerView.kt b/MXAdapt/src/main/java/com/mx/adapt/picker/MXScrollPickerView.kt index 0a34a16d89241a5b6ac95288f116ee9a7fc4de4d..55ad553f4088f793740ef727bba87de23190de02 100644 --- a/MXAdapt/src/main/java/com/mx/adapt/picker/MXScrollPickerView.kt +++ b/MXAdapt/src/main/java/com/mx/adapt/picker/MXScrollPickerView.kt @@ -13,7 +13,6 @@ 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 open class MXScrollPickerView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null @@ -39,19 +38,12 @@ open class MXScrollPickerView @JvmOverloads constructor( init { LinearSnapHelper().attachToRecyclerView(this) - layoutManager = manager + super.setLayoutManager(manager) super.setAdapter(pickerAdapt) pickerAdapt.setItemClick { position, _ -> val targetIndex = position - itemOffset smoothScrollTo(targetIndex, true) } - addOnScrollListener(object : OnScrollListener() { - override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { - if (newState == SCROLL_STATE_IDLE) { - notifySelectChange(manager.findFirstCompletelyVisibleItemPosition()) - } - } - }) viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener { override fun onPreDraw(): Boolean { @@ -63,17 +55,26 @@ open class MXScrollPickerView @JvmOverloads constructor( }) } + private val scrollListener = object : OnScrollListener() { + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + if (newState == SCROLL_STATE_IDLE) { + notifySelectChange(manager.findFirstCompletelyVisibleItemPosition()) + } + } + } + + override fun setLayoutManager(layout: LayoutManager?) { + throw Exception("Forbidden call func 'setLayoutManager()'") + } + override fun setAdapter(adapter: Adapter<*>?) { -// super.setAdapter(adapter) throw Exception("Forbidden call func 'setAdapter()'") } override fun addItemDecoration(decor: ItemDecoration) { -// super.addItemDecoration(decor) } override fun addItemDecoration(decor: ItemDecoration, index: Int) { -// super.addItemDecoration(decor, index) } override fun onDraw(canvas: Canvas) { @@ -128,6 +129,9 @@ open class MXScrollPickerView @JvmOverloads constructor( pickerAdapt.adapt = adapt adapt?.registerAdapterDataObserver(adaptObserver) pickerAdapt.notifyDataSetChanged() + + removeOnScrollListener(scrollListener) + addOnScrollListener(scrollListener) } /** @@ -136,11 +140,17 @@ open class MXScrollPickerView @JvmOverloads constructor( * @param animation 是否滚动动画 */ fun setSelectIndex(index: Int, animation: Boolean = false) { - val position = max(0, index) + val size = pickerAdapt.adapt?.itemCount ?: 0 + val targetIndex = when { + (size < 0) -> 0 + (index >= size) -> size - 1 + (index < 0) -> 0 + else -> index + } // MXUtils.log("setSelectIndex") - smoothScrollTo(position, animation) + smoothScrollTo(targetIndex, animation) post { - smoothScrollTo(position, animation) + smoothScrollTo(targetIndex, animation) } } @@ -164,26 +174,38 @@ open class MXScrollPickerView @JvmOverloads constructor( private inner class TypeObserver : AdapterDataObserver() { override fun onChanged() { pickerAdapt.notifyDataSetChanged() + checkSelectIndexOutRange() } override fun onItemRangeInserted(positionStart: Int, itemCount: Int) { pickerAdapt.notifyItemRangeInserted(positionStart + itemOffset, itemCount) + checkSelectIndexOutRange() } override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) { pickerAdapt.notifyItemRangeRemoved(positionStart + itemOffset, itemCount) + checkSelectIndexOutRange() } override fun onItemRangeChanged(positionStart: Int, itemCount: Int) { pickerAdapt.notifyItemRangeChanged(positionStart + itemOffset, itemCount) + checkSelectIndexOutRange() } override fun onItemRangeChanged(positionStart: Int, itemCount: Int, payload: Any?) { pickerAdapt.notifyItemRangeChanged(positionStart + itemOffset, itemCount, payload) + checkSelectIndexOutRange() } override fun onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int) { pickerAdapt.notifyItemMoved(fromPosition + itemOffset, toPosition + itemOffset) + checkSelectIndexOutRange() + } + + private fun checkSelectIndexOutRange() { + postDelayed({ + notifySelectChange(manager.findFirstCompletelyVisibleItemPosition()) + }, 100) } } @@ -200,7 +222,7 @@ open class MXScrollPickerView @JvmOverloads constructor( if (animation && itemHeight > 0 && animationDuration > 0) { val current = manager.findFirstCompletelyVisibleItemPosition() val top = (manager.findViewByPosition(current)?.top ?: 0) - val dy = itemHeight * (position - current) + top + val dy = (itemHeight * (position - current)) + top smoothScrollBy(0, dy, DecelerateInterpolator(), animationDuration) } else { manager.scrollToPositionWithOffset(position, 0) diff --git a/MXAdapt/src/main/java/com/mx/adapt/picker/MXStringPickerView.kt b/MXAdapt/src/main/java/com/mx/adapt/picker/MXStringPickerView.kt index d83f1df1e21c0563a4d0562f3aab3df8c5bcade0..d978ec9adf971c63a8666c9d63ccd73155abfa87 100644 --- a/MXAdapt/src/main/java/com/mx/adapt/picker/MXStringPickerView.kt +++ b/MXAdapt/src/main/java/com/mx/adapt/picker/MXStringPickerView.kt @@ -8,14 +8,13 @@ import com.mx.adapt.MXBaseSimpleAdapt open class MXStringPickerView(context: Context, attrs: AttributeSet? = null) : MXScrollPickerView(context, attrs) { - private val adapt = MXStringPickerAdapt() + val adapt = MXStringPickerAdapt() init { super.setMXAdapt(adapt) } override fun setMXAdapt(adapt: MXBaseSimpleAdapt<*>?) { - // super.setMXAdapt(adapt) throw Exception("Forbidden call func 'setMXAdapt()'") } diff --git a/README.md b/README.md index 0686ad7af0b094f393d6bf0ee00e5a40c7599296..c65af3c684a738a4d4490fbcc10d75da8b1de700 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.3.0' + implementation 'com.gitee.zhangmengxiong:MXRecycleAdapt:1.3.1' ``` #### 介绍 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 dfc814d37fb0c946a5d074370540690ad3a90157..2b6c5e916ef98e33aaa7ec54f447557ffccc977c 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 @@ -2,14 +2,9 @@ package com.mx.recycle_adapt.activity import android.graphics.Color import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity -import androidx.viewbinding.ViewBinding -import com.mx.adapt.MXBaseSimpleAdapt import com.mx.adapt.picker.IMXSelect import com.mx.recycle_adapt.R -import com.mx.recycle_adapt.databinding.AdaptSimpleIndexBinding import kotlinx.android.synthetic.main.activity_scroller_view.* import kotlin.random.Random @@ -17,60 +12,30 @@ class ScrollerViewActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_scroller_view) - val adapt = SpanCountAdapt() - adapt.list.addAll((0 until 13000)) - adapt.notifyDataSetChanged() - scrollerView.setItemSize(5) - scrollerView.setMXAdapt(adapt) - - var currentIndex = 0 - scrollerView.setOnSelectListener(object : IMXSelect { + scrollerView2.setItemSize(5) + scrollerView2.setOnSelectListener(object : IMXSelect { override fun onSelect(index: Int) { infoTxv.text = index.toString() - currentIndex = index } }) - scrollerView.setSelectIndex(100) - scrollerView.setDashColor(Color.parseColor("#33465FCD")) + scrollerView2.setDashColor(Color.parseColor("#33465FCD")) addTxv.setOnClickListener { - adapt.list.add(currentIndex, currentIndex) - adapt.notifyDataSetChanged() + scrollerView2.adapt.list.removeLastOrNull() + scrollerView2.adapt.notifyDataSetChanged() } + scrollerView2.setData((0 until 13).map { it.toString() }) + scrollerView2.setSelectIndex(100) + scrollerView2.setAnimationDuration(500) scrollTxv.setOnClickListener { - val indx = Random.nextInt(adapt.list.size) - scrollerView.setSelectIndex(indx, true) + val indx = Random.nextInt(scrollerView2.adapt.list.size) + scrollerView2.setSelectIndex(indx, true) scrollerView2.setSelectIndex(indx, true) } scrollerView2.setListItemProcess { _, _, textView -> textView.setTextColor(Color.BLUE) } - scrollerView2.setData((0 until 13000).map { it.toString() }) - scrollerView2.setSelectIndex(100) - } - - - private class SpanCountAdapt : MXBaseSimpleAdapt() { - init { - setItemClick { position, record -> - list.removeAt(position) - notifyItemRemoved(position) - } - } - - override fun createItem( - inflater: LayoutInflater, - parent: ViewGroup, - viewType: Int - ): AdaptSimpleIndexBinding { - return AdaptSimpleIndexBinding.inflate(inflater, parent, false) - } - - override fun bindView(position: Int, binding: ViewBinding, record: Int) { - binding as AdaptSimpleIndexBinding - binding.indexTxv.text = "" + (record) - } } } \ No newline at end of file diff --git a/build.gradle b/build.gradle index 6c9c340eade52179bbd4f4140e2520f420002ae1..f23756b25bf82d0bb57029291a506da6e83bf603 100644 --- a/build.gradle +++ b/build.gradle @@ -35,5 +35,5 @@ ext { minSdkVersion = 19 versionCode = 1 - versionName = "1.3.0" + versionName = "1.3.1" } \ No newline at end of file