web-dev-qa-db-ja.com

Android ViewPager2の高さを現在のアイテムの高さにラップする方法は?

この質問は、新しいViewPager2クラスに関するものです。

古いViewPagerの同様の質問 がありますが、解決策はViewPagerを拡張する必要があります。ただし、ViewPager2は最終版なので拡張できません。

私の状況では、3つの異なるフラグメントを含むViewPager2があります。これらのフラグメントの1つは他の2つのフラグメントよりもはるかに高いため、短いフラグメントの1つにスワイプすると、多くの空きスペースができます。では、ViewPager2を現在のフラグメントの高さに効果的にラップする方法を教えてください。

9

私はこの回避策にまったく満足していませんが、異なる高さのフラグメントでViewPager2を使用しようとしたときに発生したレンダリングの問題を解決します。それは明らかにレンダリングを遅くし、より多くのメモリを消費します。

myStupidViewPager2.offscreenPageLimit = fragments.size
4
Kimble

フラグメントでViewPager2を使用している場合!子のサイズが変更された後、呼び出す必要があります:

parentFragment?.view?.findViewById<ViewPager2>(R.id.YourViewPager)?.apply {
      requestLayout()
}

あなたの子供のビューで。

0
Iliya Mashin

Zer0インデックスではなく任意の特定の位置で子にアクセスすると、ビューがnullになるため、アダプターを介して子にアクセスするこの質問に対する回答を見つけました。

class ViewPager2PageChangeCallback() : ViewPager2.OnPageChangeCallback() {
    override fun onPageSelected(position: Int) {
        val view = (pager.adapter as pagerAdapter).getViewAtPosition(position)
        view?.let {
            updatePagerHeightForChild(view, pager)
        }
    }
}

private fun updatePagerHeightForChild(view: View, pager: ViewPager2) {
    view.post {
        val wMeasureSpec =
            View.MeasureSpec.makeMeasureSpec(view.width, View.MeasureSpec.EXACTLY)
        val hMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
        view.measure(wMeasureSpec, hMeasureSpec)

        if (pager.layoutParams.height != view.measuredHeight) {
            pager.layoutParams = (pager.layoutParams)
                .also { lp ->
                    lp.height = view.measuredHeight
                }
        }
    }
}

        pagerpager.registerOnPageChangeCallback(ViewPager2PageChangeCallback())

 override fun onDestroy() {
    super.onDestroy()
    pager.unregisterOnPageChangeCallback(ViewPager2PageChangeCallback())
}



class OrderDetailsPager(
private val arrayList: ArrayList<Fragment>,
fragmentManger: FragmentManager,
lifecycle: Lifecycle
) : FragmentStateAdapter(fragmentManger, lifecycle) {
override fun createFragment(position: Int): Fragment {
    return arrayList[position]
}

override fun getItemCount(): Int {
    return arrayList.size
}

fun getViewAtPosition(position: Int): View? {
    return arrayList[position].view
}

}

0
Assem Mahrous

私にとっては、viewpager2のrecyclerviewレイアウトパラメータを設定してこの問題を解決します。

試す

<androidx.viewpager2.widget.ViewPager2
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content" />

そして、recyclerviewレイアウトパラメータを設定します

RecyclerView recyclerView = (RecyclerView) viewPager.getChildAt(0);
recyclerView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
0
KayaMeaw