Список другого размера в ViewPager2, в NestedScrollView - PullRequest
2 голосов
/ 21 января 2020

Моя проблема в том, что у меня есть 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

1 Ответ

0 голосов
/ 21 января 2020

Пожалуйста, используйте этот вид пейджер, который измеряет высоту при переключении вкладок

public class WrapContentViewPager extends ViewPager {
private View mCurrentView;

public WrapContentViewPager(Context context) {
    super(context);
}

public WrapContentViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (mCurrentView == null) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        return;
    }
    int height = 0;
    mCurrentView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
    int h = mCurrentView.getMeasuredHeight();
    if (h > height) height = h;
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

public void measureCurrentView(View currentView) {
    mCurrentView = currentView;
    requestLayout();
}

}

...