Skip to content

Commit d8c8205

Browse files
committed
fix bug:loopviewpager position confusion
1 parent cac9a40 commit d8c8205

File tree

4 files changed

+36
-9
lines changed

4 files changed

+36
-9
lines changed

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ dependencies {
3333
compile fileTree(dir: 'libs', include: ['*.jar'])
3434
compile project(':lib')
3535
compile project(':tablayoutsupport')
36-
compile 'com.android.support:appcompat-v7:22.2.1'
37-
compile 'com.android.support:design:22.2.1'
36+
compile 'com.android.support:appcompat-v7:23.3.0'
37+
compile 'com.android.support:design:23.3.0'
3838

3939
compile 'com.github.bumptech.glide:glide:3.6.0'
4040
compile 'de.hdodenhof:circleimageview:1.3.0'

lib/src/main/java/com/lsjwzh/widget/recyclerviewpager/LoopRecyclerViewPager.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.content.Context;
44
import android.support.annotation.NonNull;
55
import android.util.AttributeSet;
6+
import android.util.Log;
67

78
public class LoopRecyclerViewPager extends RecyclerViewPager {
89

@@ -47,7 +48,9 @@ protected RecyclerViewPagerAdapter ensureRecyclerViewPagerAdapter(Adapter adapte
4748
*/
4849
@Override
4950
public void smoothScrollToPosition(int position) {
50-
super.smoothScrollToPosition(transformInnerPositionIfNeed(position));
51+
int transformedPosition = transformInnerPositionIfNeed(position);
52+
super.smoothScrollToPosition(transformedPosition);
53+
Log.e("test", "transformedPosition:" + transformedPosition);
5154
}
5255

5356
/**
@@ -76,15 +79,15 @@ public int getActualCurrentPosition() {
7679
* @return actual position
7780
*/
7881
public int transformToActualPosition(int position) {
79-
return position % getActualItemCountFromAdpater();
82+
return position % getActualItemCountFromAdapter();
8083
}
8184

82-
private int getActualItemCountFromAdpater() {
85+
private int getActualItemCountFromAdapter() {
8386
return ((LoopRecyclerViewPagerAdapter) getWrapperAdapter()).getActualItemCount();
8487
}
8588

8689
private int transformInnerPositionIfNeed(int position) {
87-
final int actualItemCount = getActualItemCountFromAdpater();
90+
final int actualItemCount = getActualItemCountFromAdapter();
8891
final int actualCurrentPosition = getCurrentPosition() % actualItemCount;
8992
int bakPosition1 = getCurrentPosition()
9093
- actualCurrentPosition
@@ -97,6 +100,7 @@ private int transformInnerPositionIfNeed(int position) {
97100
- actualCurrentPosition
98101
+ actualItemCount
99102
+ position % actualItemCount;
103+
Log.e("test", bakPosition1 + "/" + bakPosition2 + "/" + bakPosition3 + "/" + getCurrentPosition());
100104
// get position which is closer to current position
101105
if (Math.abs(bakPosition1 - getCurrentPosition()) > Math.abs(bakPosition2 -
102106
getCurrentPosition())){
@@ -118,7 +122,7 @@ private int transformInnerPositionIfNeed(int position) {
118122

119123
private int getMiddlePosition() {
120124
int middlePosition = Integer.MAX_VALUE / 2;
121-
final int actualItemCount = getActualItemCountFromAdpater();
125+
final int actualItemCount = getActualItemCountFromAdapter();
122126
if (actualItemCount > 0 && middlePosition % actualItemCount != 0) {
123127
middlePosition = middlePosition - middlePosition % actualItemCount;
124128
}

lib/src/main/java/com/lsjwzh/widget/recyclerviewpager/LoopRecyclerViewPagerAdapter.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@
22

33
import android.support.v7.widget.RecyclerView;
44

5+
import java.lang.reflect.Field;
6+
57
public class LoopRecyclerViewPagerAdapter<VH extends RecyclerView.ViewHolder>
68
extends RecyclerViewPagerAdapter<VH> {
79

10+
private Field mPositionField;
11+
812
public LoopRecyclerViewPagerAdapter(RecyclerViewPager viewPager, RecyclerView.Adapter<VH> adapter) {
913
super(viewPager, adapter);
1014
}
@@ -39,6 +43,21 @@ public long getItemId(int position) {
3943
@Override
4044
public void onBindViewHolder(VH holder, int position) {
4145
super.onBindViewHolder(holder, getActualPosition(position));
46+
// because of getCurrentPosition may return ViewHolder‘s position,
47+
// so we must reset mPosition.
48+
if (mPositionField == null) {
49+
try {
50+
mPositionField = holder.getClass().getDeclaredField("mPosition");
51+
mPositionField.setAccessible(true);
52+
} catch (NoSuchFieldException e) {
53+
e.printStackTrace();
54+
}
55+
}
56+
try {
57+
mPositionField.set(holder, position);;
58+
} catch (Exception e) {
59+
e.printStackTrace();
60+
}
4261
}
4362

4463
public int getActualPosition(int position) {

tablayoutsupport/src/main/java/com/lsjwzh/widget/recyclerviewpager/TabLayoutSupport.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,14 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
9090
final float positionOffset = offset * 1f / pagerWidth;
9191
if (tabLayout != null) {
9292
if (positionOffset < 0) {
93-
tabLayout.setScrollPosition(mPositionBeforeScroll
94-
+ (int) Math.floor(positionOffset),
93+
try {
94+
tabLayout.setScrollPosition(mPositionBeforeScroll
95+
+ (int) Math.floor(positionOffset),
9596
positionOffset - (int) Math.floor(positionOffset),
9697
false);
98+
} catch (Throwable e) {
99+
e.printStackTrace();
100+
}
97101
} else {
98102
tabLayout.setScrollPosition(mPositionBeforeScroll + (int) (positionOffset),
99103
positionOffset - (int) (positionOffset),

0 commit comments

Comments
 (0)