Моя проблема в том, что у меня есть 2 разных списка внутри ViewPager2
, и они не имеют одинаковый размер. И я не хочу иметь возможность прокручивать ниже маленького.
NestedScrollView (Activity)
|
|
|
FrameLayout
|
|
|
LinearLayout (Fragment)
|
|
|
ViewPager2
|
|
|
RecyclerView
_______________________________________________
| ViewPager2 |
_______________________________________________
| | |
| | |
| | |
| Page 1 | Page 2 |
| | |
| | |
| |_______________________
| |
| |
| |
| | Space I don't want to be able to see / scroll
| |
| |
| |
| |
________________________
У меня есть это UnScrollView
, где я могу отключить прокрутку, но проблема, когда я ставлю scrollable
ложно. Он не go внутри onTouchEvent
, но он все еще может прокручиваться.
class UnScrollView @JvmOverloads constructor(
context: Context,
attributeSet: AttributeSet? = null,
defStyle: Int = 0) : NestedScrollView(context, attributeSet, defStyle) {
var scrollable = true
fun isScrollable() = scrollable
override fun performClick() = super.performClick()
override fun onTouchEvent(ev: MotionEvent): Boolean {
return scrollable && super.onTouchEvent(ev)
}
override fun onInterceptTouchEvent(ev: MotionEvent)
= scrollable && super.onInterceptTouchEvent(ev)
}
И этот код определяет, когда мы можем прокручивать или нет
(requireActivity() as MainActivity).binding
.scroll
.setOnScrollChangeListener { v: NestedScrollView?, scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int ->
println("####################################################################################")
println("ScrollY : ${v?.cast<NestedScrollView>()?.scrollY}")
println("ViewPager H: ${binding.viewPager.height}")
binding.viewPager.children.first().cast<RecyclerView>()
?.children
?.mapNotNull { it.findViewById<RecyclerView>(R.id.list) }
?.elementAt(binding.viewPager.currentItem)
?.let {
val manager = (it.layoutManager as GridLayoutManager)
val tmp = (it.adapter?.itemCount ?: 0) / manager.spanCount
val minTmp = it.children.first().height.times(tmp)
val displayMetrics = DisplayMetrics()
requireActivity().windowManager.defaultDisplay.getMetrics(displayMetrics)
println("Row: $tmp")
println("HeightRow: ${it.children.first().height}")
println("Height: ${it.children.first().height.times(tmp)}")
println("MinTMP: $minTmp")
println("ScrollY: ${v?.cast<NestedScrollView>()?.scrollY}")
println("Display HEIGHT: ${requireActivity().px2dp(displayMetrics.heightPixels.toFloat())}")
println("Display + ScrollY: ${v?.cast<NestedScrollView>()?.scrollY?.plus(requireActivity().px2dp(displayMetrics.heightPixels.toFloat()))}")
if ((v?.cast<NestedScrollView>()?.scrollY?.plus(requireActivity().px2dp(displayMetrics.heightPixels.toFloat())) ?: 0f) > minTmp) {
println("blocked")
v?.cast<UnScrollView>()?.scrollable = false
} else {
println("not blocked")
v?.cast<UnScrollView>()?.scrollable = true
}
}
}
И весь экран должен прокручиваться, у меня TabLayout
и TextView
выше ViewPager2
, поэтому прокрутка должна быть за пределами страницы ViewPager2