@@ -4,10 +4,15 @@ import android.view.View
44import android.view.ViewGroup
55import androidx.viewpager2.widget.ViewPager2
66import com.facebook.react.uimanager.PixelUtil
7+ import android.os.Handler
8+ import android.os.Looper
9+ import android.view.Choreographer
710
811object PagerViewViewManagerImpl {
912 const val NAME = " RNCViewPager"
1013
14+ private var refreshFrameCallback: Choreographer .FrameCallback ? = null
15+
1116 fun getViewPager (view : NestedScrollableHost ): ViewPager2 {
1217 if (view.getChildAt(0 ) is ViewPager2 ) {
1318 return view.getChildAt(0 ) as ViewPager2
@@ -78,8 +83,8 @@ object PagerViewViewManagerImpl {
7883 }
7984
8085 adapter?.removeChildAt(index)
81-
82- refreshViewChildrenLayout (pager)
86+
87+ debouncedRefreshViewChildrenLayout (pager)
8388 }
8489
8590 fun needsCustomLayoutForChildren (): Boolean {
@@ -157,9 +162,26 @@ object PagerViewViewManagerImpl {
157162 private fun refreshViewChildrenLayout (view : View ) {
158163 view.post {
159164 view.measure(
160- View .MeasureSpec .makeMeasureSpec(view.width, View .MeasureSpec .EXACTLY ),
161- View .MeasureSpec .makeMeasureSpec(view.height, View .MeasureSpec .EXACTLY ))
165+ View .MeasureSpec .makeMeasureSpec(view.width, View .MeasureSpec .EXACTLY ),
166+ View .MeasureSpec .makeMeasureSpec(view.height, View .MeasureSpec .EXACTLY ))
162167 view.layout(view.left, view.top, view.right, view.bottom)
163168 }
164169 }
170+
171+ private fun debouncedRefreshViewChildrenLayout (view : View ) {
172+ // Fixes https://github.com/callstack/react-native-pager-view/issues/946
173+ refreshFrameCallback?.let { Choreographer .getInstance().removeFrameCallback(it) }
174+
175+ val adapter = (view as ? ViewPager2 )?.adapter as ? ViewPagerAdapter
176+ if (adapter == null || adapter.itemCount == 0 ) {
177+ // Do not call refreshViewChildrenLayout on pager unmount
178+ return
179+ }
180+
181+ refreshFrameCallback = Choreographer .FrameCallback {
182+ refreshViewChildrenLayout(view)
183+ refreshFrameCallback = null
184+ }
185+ Choreographer .getInstance().postFrameCallback(refreshFrameCallback)
186+ }
165187}
0 commit comments