@@ -4,10 +4,15 @@ import android.view.View
4
4
import android.view.ViewGroup
5
5
import androidx.viewpager2.widget.ViewPager2
6
6
import com.facebook.react.uimanager.PixelUtil
7
+ import android.os.Handler
8
+ import android.os.Looper
9
+ import android.view.Choreographer
7
10
8
11
object PagerViewViewManagerImpl {
9
12
const val NAME = " RNCViewPager"
10
13
14
+ private var refreshFrameCallback: Choreographer .FrameCallback ? = null
15
+
11
16
fun getViewPager (view : NestedScrollableHost ): ViewPager2 {
12
17
if (view.getChildAt(0 ) is ViewPager2 ) {
13
18
return view.getChildAt(0 ) as ViewPager2
@@ -78,8 +83,8 @@ object PagerViewViewManagerImpl {
78
83
}
79
84
80
85
adapter?.removeChildAt(index)
81
-
82
- refreshViewChildrenLayout (pager)
86
+
87
+ debouncedRefreshViewChildrenLayout (pager)
83
88
}
84
89
85
90
fun needsCustomLayoutForChildren (): Boolean {
@@ -157,9 +162,26 @@ object PagerViewViewManagerImpl {
157
162
private fun refreshViewChildrenLayout (view : View ) {
158
163
view.post {
159
164
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 ))
162
167
view.layout(view.left, view.top, view.right, view.bottom)
163
168
}
164
169
}
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
+ }
165
187
}
0 commit comments