web-dev-qa-db-fra.com

Comment envelopper la hauteur de Android ViewPager2 à la hauteur de l'élément actuel?

Cette question concerne la nouvelle classe ViewPager2 .

Il y a un question similaire pour l'ancien ViewPager , mais la solution nécessite d'étendre ViewPager . Cependant, ViewPager2 est final et ne peut donc pas être étendu.

Dans ma situation, j'ai un ViewPager2 qui contient trois fragments différents. L'un de ces fragments est beaucoup plus grand que les deux autres, ce qui signifie que lorsque vous glissez sur l'un des fragments les plus courts, il y a beaucoup d'espace vide. Alors, comment puis-je envelopper efficacement le ViewPager2 à la hauteur du fragment actuel?

9
ban-geoengineering

Je ne suis pas du tout satisfait de cette solution de contournement, mais cela résout les problèmes de rendu que j'ai rencontrés en essayant d'utiliser ViewPager2 avec des fragments de hauteurs différentes. Cela ralentira évidemment le rendu et consommera plus de mémoire.

myStupidViewPager2.offscreenPageLimit = fragments.size
4
Kimble

Si vous utilisez ViewPager2 avec des fragments! Une fois la taille de l'enfant modifiée, vous devez appeler:

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

dans votre vue enfant.

0
Iliya Mashin

J'ai trouvé une réponse à cette question où j'accède à l'enfant via son adaptateur car lorsque vous accédez à l'enfant à une position donnée plutôt qu'à l'index Zer0, la vue est nulle.

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

Pour moi, définissez les paramètres de présentation de la vue de recyclage de viewpager2 pour résoudre ce problème.

Essayer

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

et définir les paramètres de mise en page recyclerview

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