Skip to content

Commit fdf3d8f

Browse files
authored
fix(android): use RecyclerView.Adapter instead of FragmentStateAdapter (#404)
* refactor: use RecyclerView.Adapter instead of FragmentStateAdapter * refactor: use proper const values and change casting type
1 parent a607088 commit fdf3d8f

File tree

5 files changed

+91
-115
lines changed

5 files changed

+91
-115
lines changed

android/src/main/java/com/reactnativepagerview/FragmentAdapter.kt

Lines changed: 0 additions & 56 deletions
This file was deleted.

android/src/main/java/com/reactnativepagerview/PagerViewViewManager.kt

Lines changed: 10 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,32 @@
11
package com.reactnativepagerview
22

3-
import android.util.LayoutDirection
43
import android.view.View
5-
import androidx.fragment.app.FragmentActivity
64
import androidx.viewpager2.widget.ViewPager2
75
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
86
import com.facebook.infer.annotation.Assertions
97
import com.facebook.react.bridge.ReadableArray
108
import com.facebook.react.common.MapBuilder
11-
import com.facebook.react.bridge.LifecycleEventListener
129
import com.facebook.react.uimanager.PixelUtil
1310
import com.facebook.react.uimanager.ThemedReactContext
1411
import com.facebook.react.uimanager.UIManagerModule
1512
import com.facebook.react.uimanager.ViewGroupManager
1613
import com.facebook.react.uimanager.annotations.ReactProp
1714
import com.facebook.react.uimanager.events.EventDispatcher
18-
import com.reactnativepagerview.Helper.Companion.getReactContext
1915
import com.reactnativepagerview.event.PageScrollEvent
2016
import com.reactnativepagerview.event.PageScrollStateChangedEvent
2117
import com.reactnativepagerview.event.PageSelectedEvent
2218

2319

2420
class PagerViewViewManager : ViewGroupManager<ViewPager2>() {
2521
private lateinit var eventDispatcher: EventDispatcher
26-
private lateinit var lifecycleEventListener: LifecycleEventListener
27-
2822

2923
override fun getName(): String {
3024
return REACT_CLASS
3125
}
3226

33-
fun createFragmentAdapter(reactContext: ThemedReactContext): FragmentAdapter {
34-
return FragmentAdapter((reactContext.currentActivity as FragmentActivity?)!!)
35-
}
36-
3727
override fun createViewInstance(reactContext: ThemedReactContext): ViewPager2 {
3828
val vp = ViewPager2(reactContext)
39-
if(reactContext.hasCurrentActivity()) {
40-
vp.adapter = createFragmentAdapter(reactContext);
41-
}
42-
lifecycleEventListener = object : LifecycleEventListener {
43-
override fun onHostResume() {
44-
if(vp.adapter == null && reactContext.hasCurrentActivity()) {
45-
vp.adapter = createFragmentAdapter(reactContext)
46-
}
47-
}
48-
override fun onHostPause() {}
49-
override fun onHostDestroy() {}
50-
}
51-
reactContext.addLifecycleEventListener(lifecycleEventListener);
29+
vp.adapter = ViewPagerAdapter()
5230
//https://github.com/callstack/react-native-viewpager/issues/183
5331
vp.isSaveEnabled = false
5432
eventDispatcher = reactContext.getNativeModule(UIManagerModule::class.java)!!.eventDispatcher
@@ -86,21 +64,17 @@ class PagerViewViewManager : ViewGroupManager<ViewPager2>() {
8664
return vp
8765
}
8866

89-
override fun onDropViewInstance(view: ViewPager2) {
90-
super.onDropViewInstance(view)
91-
getReactContext(view)?.removeLifecycleEventListener(lifecycleEventListener)
92-
}
93-
9467
private fun setCurrentItem(view: ViewPager2, selectedTab: Int, scrollSmooth: Boolean) {
9568
refreshViewChildrenLayout(view)
9669
view.setCurrentItem(selectedTab, scrollSmooth)
9770
}
9871

99-
override fun addView(parent: ViewPager2, child: View, index: Int) {
72+
override fun addView(parent: ViewPager2, child: View?, index: Int) {
10073
if (child == null) {
10174
return
10275
}
103-
(parent.adapter as FragmentAdapter?)?.addFragment(child, index)
76+
77+
(parent.adapter as ViewPagerAdapter?)?.addChild(child, index);
10478

10579
if (parent.currentItem == index) {
10680
// Solves https://github.com/callstack/react-native-pager-view/issues/219
@@ -112,15 +86,15 @@ class PagerViewViewManager : ViewGroupManager<ViewPager2>() {
11286
}
11387

11488
override fun getChildCount(parent: ViewPager2): Int {
115-
return parent?.adapter?.itemCount ?: 0;
89+
return parent.adapter?.itemCount ?: 0;
11690
}
11791

11892
override fun getChildAt(parent: ViewPager2, index: Int): View {
119-
return (parent.adapter as FragmentAdapter?)!!.getChildViewAt(index)
93+
return (parent.adapter as ViewPagerAdapter?)!!.getChildAt(index)
12094
}
12195

12296
override fun removeView(parent: ViewPager2, view: View) {
123-
(parent.adapter as FragmentAdapter?)?.removeFragment(view)
97+
(parent.adapter as ViewPagerAdapter?)?.removeChild(view)
12498

12599
// Required so ViewPager actually animates the removed view right away (otherwise
126100
// a white screen is shown until the next user interaction).
@@ -130,13 +104,13 @@ class PagerViewViewManager : ViewGroupManager<ViewPager2>() {
130104

131105
override fun removeAllViews(parent: ViewPager2) {
132106
parent.isUserInputEnabled = false
133-
val adapter = parent.adapter as FragmentAdapter?
107+
val adapter = parent.adapter as ViewPagerAdapter?
134108
adapter?.removeAll()
135109
}
136110

137111
override fun removeViewAt(parent: ViewPager2, index: Int) {
138-
val adapter = parent.adapter as FragmentAdapter?
139-
adapter?.removeFragmentAt(index)
112+
val adapter = parent.adapter as ViewPagerAdapter?
113+
adapter?.removeChildAt(index)
140114

141115
// Required so ViewPager actually animates the removed view right away (otherwise
142116
// a white screen is shown until the next user interaction).
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.reactnativepagerview
2+
3+
import android.view.View
4+
import android.view.ViewGroup
5+
import android.widget.FrameLayout
6+
import androidx.recyclerview.widget.RecyclerView.Adapter
7+
import java.util.*
8+
9+
10+
class ViewPagerAdapter() : Adapter<ViewPagerViewHolder>() {
11+
private val childrenViews: ArrayList<View> = ArrayList()
12+
13+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewPagerViewHolder {
14+
return ViewPagerViewHolder.create(parent)
15+
}
16+
17+
override fun onBindViewHolder(holder: ViewPagerViewHolder, index: Int) {
18+
val container: FrameLayout = holder.container
19+
val child = getChildAt(index)
20+
21+
if (container.childCount > 0) {
22+
container.removeAllViews()
23+
}
24+
25+
if (child.parent != null) {
26+
(child.parent as FrameLayout).removeView(child)
27+
}
28+
29+
container.addView(child)
30+
}
31+
32+
override fun getItemCount(): Int {
33+
return childrenViews.size
34+
}
35+
36+
fun addChild(child: View, index: Int) {
37+
childrenViews.add(index, child)
38+
notifyItemInserted(index)
39+
}
40+
41+
fun getChildAt(index: Int): View {
42+
return childrenViews[index]
43+
}
44+
45+
fun removeChild(child: View) {
46+
val index = childrenViews.indexOf(child)
47+
removeChildAt(index)
48+
}
49+
50+
fun removeAll() {
51+
val removedChildrenCount = childrenViews.size
52+
childrenViews.clear()
53+
notifyItemRangeRemoved(0, removedChildrenCount)
54+
}
55+
56+
fun removeChildAt(index: Int) {
57+
childrenViews.removeAt(index)
58+
notifyItemRemoved(index)
59+
}
60+
}

android/src/main/java/com/reactnativepagerview/ViewPagerFragment.kt

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.reactnativepagerview
2+
3+
import android.view.ViewGroup
4+
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
5+
import android.widget.FrameLayout
6+
import androidx.recyclerview.widget.RecyclerView.ViewHolder
7+
8+
9+
class ViewPagerViewHolder private constructor(container: FrameLayout) : ViewHolder(container) {
10+
val container: FrameLayout
11+
get() = itemView as FrameLayout
12+
13+
companion object {
14+
fun create(parent: ViewGroup): ViewPagerViewHolder {
15+
val container = FrameLayout(parent.context)
16+
container.layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
17+
container.isSaveEnabled = false
18+
return ViewPagerViewHolder(container)
19+
}
20+
}
21+
}

0 commit comments

Comments
 (0)