Skip to content

Commit 045c750

Browse files
authored
fix(android): add unique id to fix page removal (#214)
1 parent cc4d99d commit 045c750

File tree

2 files changed

+18
-37
lines changed

2 files changed

+18
-37
lines changed

android/src/main/java/com/reactnativecommunity/viewpager/FragmentAdapter.java

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,66 +6,55 @@
66
import androidx.fragment.app.Fragment;
77
import androidx.fragment.app.FragmentActivity;
88

9-
109
import com.reactnative.community.viewpager2.adapter.FragmentStateAdapter;
1110

1211
import java.util.ArrayList;
1312

14-
import static com.reactnativecommunity.viewpager.ViewPagerFragment.CHILD_VIEW_KEY;
15-
1613
public class FragmentAdapter extends FragmentStateAdapter {
1714

1815
public FragmentAdapter(@NonNull FragmentActivity fragmentActivity) {
1916
super(fragmentActivity);
2017
}
2118

22-
private ArrayList<ViewPagerFragment> children = new ArrayList<>();
19+
private ArrayList<Integer> childrenViewIDs = new ArrayList<>();
2320

2421
@NonNull
2522
@Override
2623
public Fragment createFragment(int position) {
27-
return children.get(position);
24+
return ViewPagerFragment.newInstance(childrenViewIDs.get(position));
2825
}
2926

3027
@Override
3128
public int getItemCount() {
32-
return children.size();
29+
return childrenViewIDs.size();
30+
}
31+
32+
@Override
33+
public long getItemId(int position) {
34+
return childrenViewIDs.get(position);
3335
}
3436

3537
public void addFragment(View child, int index) {
36-
children.add(ViewPagerFragment.newInstance(child.getId()));
38+
childrenViewIDs.add(child.getId());
3739
notifyItemChanged(index);
3840
}
3941

40-
4142
public void removeFragment(View child) {
42-
for (int i = 0; i < children.size(); i++) {
43-
Fragment fragment = children.get(i);
44-
int viewID = fragment.getArguments().getInt(CHILD_VIEW_KEY);
45-
if (viewID == child.getId()) {
46-
children.remove(i);
47-
notifyItemRemoved(i);
48-
return;
49-
}
50-
}
43+
int index = childrenViewIDs.indexOf(child.getId());
44+
removeFragmentAt(index);
5145
}
5246

5347
public void removeFragmentAt(int index) {
54-
children.remove(index);
48+
childrenViewIDs.remove(index);
5549
notifyItemRemoved(index);
5650
}
5751

58-
5952
public void removeAll() {
60-
children.clear();
53+
childrenViewIDs.clear();
6154
notifyDataSetChanged();
6255
}
6356

64-
public ArrayList<ViewPagerFragment> getChildren() {
65-
return children;
66-
}
67-
68-
public View getChildAt(int index) {
69-
return children.get(index).getView();
57+
public int getChildViewIDAt(int index) {
58+
return childrenViewIDs.get(index);
7059
}
7160
}

android/src/main/java/com/reactnativecommunity/viewpager/ReactViewPagerManager.java

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@
1313
import androidx.annotation.NonNull;
1414
import androidx.annotation.Nullable;
1515

16-
import androidx.fragment.app.Fragment;
1716
import androidx.fragment.app.FragmentActivity;
1817

19-
2018
import com.facebook.infer.annotation.Assertions;
2119
import com.facebook.react.bridge.ReadableArray;
2220
import com.facebook.react.common.MapBuilder;
@@ -38,7 +36,6 @@
3836
import static com.reactnative.community.viewpager2.widget.ViewPager2.SCROLL_STATE_DRAGGING;
3937
import static com.reactnative.community.viewpager2.widget.ViewPager2.SCROLL_STATE_IDLE;
4038
import static com.reactnative.community.viewpager2.widget.ViewPager2.SCROLL_STATE_SETTLING;
41-
import static com.reactnativecommunity.viewpager.ViewPagerFragment.CHILD_VIEW_KEY;
4239

4340
public class ReactViewPagerManager extends ViewGroupManager<ViewPager2> {
4441

@@ -118,7 +115,7 @@ public int getChildCount(ViewPager2 parent) {
118115

119116
@Override
120117
public View getChildAt(ViewPager2 parent, int index) {
121-
return ((FragmentAdapter) parent.getAdapter()).getChildAt(index);
118+
return reactChildrenViews.get(((FragmentAdapter) parent.getAdapter()).getChildViewIDAt(index));
122119
}
123120

124121
@Override
@@ -130,20 +127,15 @@ public void removeView(ViewPager2 parent, View view) {
130127

131128
public void removeAllViews(ViewPager2 parent) {
132129
FragmentAdapter adapter = ((FragmentAdapter) parent.getAdapter());
133-
for (Fragment fragment : adapter.getChildren()) {
134-
int viewID = fragment.getArguments().getInt(CHILD_VIEW_KEY);
135-
reactChildrenViews.remove(viewID);
136-
}
130+
reactChildrenViews.clear();
137131
adapter.removeAll();
138132
parent.setAdapter(null);
139133
}
140134

141135
@Override
142136
public void removeViewAt(ViewPager2 parent, int index) {
143137
FragmentAdapter adapter = ((FragmentAdapter) parent.getAdapter());
144-
Fragment fragment = adapter.getChildren().get(index);
145-
int viewID = fragment.getArguments().getInt(CHILD_VIEW_KEY);
146-
reactChildrenViews.remove(viewID);
138+
reactChildrenViews.remove(adapter.getChildViewIDAt(index));
147139
adapter.removeFragmentAt(index);
148140
}
149141

0 commit comments

Comments
 (0)