Skip to content

Commit cb39843

Browse files
author
teach
committed
处理ConsecutiveViewPager
1 parent 814c0fe commit cb39843

File tree

3 files changed

+67
-9
lines changed

3 files changed

+67
-9
lines changed

app/src/main/java/com/donkingliang/consecutivescrollerdemo/ViewPagerActivity.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,21 @@
33
import android.os.Bundle;
44
import android.support.design.widget.TabLayout;
55
import android.support.v4.app.Fragment;
6-
import android.support.v4.view.ViewPager;
76
import android.support.v7.app.AppCompatActivity;
87
import android.widget.TextView;
98

9+
import com.donkingliang.consecutivescroller.ConsecutiveViewPager;
1010
import com.donkingliang.consecutivescrollerdemo.adapter.TabPagerAdapter;
1111

1212
import java.util.ArrayList;
1313
import java.util.List;
1414

15+
1516
public class ViewPagerActivity extends AppCompatActivity {
1617

18+
private ConsecutiveViewPager viewPager;
19+
private TabLayout tabLayout;
20+
1721
@Override
1822
protected void onCreate(Bundle savedInstanceState) {
1923
super.onCreate(savedInstanceState);
@@ -24,10 +28,17 @@ protected void onCreate(Bundle savedInstanceState) {
2428
"下面的例子中,通过自定义ViewPager,实现IConsecutiveScroller接口,ConsecutiveScrollerLayout能正确的处理ViewPager里" +
2529
"的子布局。如果ViewPager的内容是可以垂直滑动的,请使用ConsecutiveScrollerLayout或者RecyclerView等可滑动布局作为它内容的根布局。\n" +
2630
"下面的列子中使用ViewPager承载多个Fragment,Fragment的根布局为ConsecutiveScrollerLayout。");
27-
ViewPager viewPager = findViewById(R.id.viewPager);
28-
TabLayout tabLayout = findViewById(R.id.tabLayout);
31+
viewPager = findViewById(R.id.viewPager);
32+
tabLayout = findViewById(R.id.tabLayout);
2933
viewPager.setAdapter(new TabPagerAdapter(getSupportFragmentManager(), getTabs(), getFragments()));
3034
tabLayout.setupWithViewPager(viewPager);
35+
36+
tabLayout.post(new Runnable() {
37+
@Override
38+
public void run() {
39+
viewPager.setAdjustHeight(tabLayout.getHeight());
40+
}
41+
});
3142
}
3243

3344
private List<String> getTabs() {

consecutivescroller/src/main/java/com/donkingliang/consecutivescroller/ConsecutiveScrollerLayout.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -827,9 +827,15 @@ private void scrollUp(int offset) {
827827
}
828828

829829
scrollOffset = 0;
830+
830831
if (!isScrollBottom()) {
831832
// 找到当前显示的第一个View
832-
View firstVisibleView = findFirstVisibleView();
833+
View firstVisibleView = null;
834+
if (getScrollY() < mScrollRange) {
835+
firstVisibleView = findFirstVisibleView();
836+
} else {
837+
firstVisibleView = getBottomView();
838+
}
833839
if (firstVisibleView != null) {
834840
awakenScrollBars();
835841
int bottomOffset = ScrollUtils.getScrollBottomOffset(firstVisibleView);
@@ -990,10 +996,8 @@ public void checkLayoutChange(boolean changed, boolean isForce) {
990996
mAdjust = 0;
991997
checkTargetsScroll(true, isForce);
992998

993-
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
994999
resetChildren();
9951000
resetSticky();
996-
// }
9971001
}
9981002

9991003
/**
@@ -1043,6 +1047,9 @@ private void checkTargetsScroll(boolean isLayoutChange, boolean isForce) {
10431047
for (int i = index + 1; i < getChildCount(); i++) {
10441048
final View child = getChildAt(i);
10451049
if (ScrollUtils.isConsecutiveScrollerChild(child)) {
1050+
if (i == getChildCount() - 1 && child instanceof ConsecutiveViewPager && getScrollY() >= mScrollRange) {
1051+
continue;
1052+
}
10461053
if (child instanceof IConsecutiveScroller) {
10471054
List<View> views = ((IConsecutiveScroller) child).getScrolledViews();
10481055
if (views != null && !views.isEmpty()) {
@@ -1051,7 +1058,6 @@ private void checkTargetsScroll(boolean isLayoutChange, boolean isForce) {
10511058
scrollChildContentToTop(views.get(c));
10521059
}
10531060
}
1054-
10551061
} else {
10561062
scrollChildContentToTop(child);
10571063
}
@@ -1191,6 +1197,13 @@ private void stopScroll() {
11911197
stopNestedScroll(ViewCompat.TYPE_NON_TOUCH);
11921198
}
11931199

1200+
private View getBottomView() {
1201+
if (getChildCount() > 0) {
1202+
return getChildAt(getChildCount() - 1);
1203+
}
1204+
return null;
1205+
}
1206+
11941207
/**
11951208
* 返回所有的非GONE子View
11961209
*

consecutivescroller/src/main/java/com/donkingliang/consecutivescroller/ConsecutiveViewPager.java

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import android.support.v4.view.ViewPager;
77
import android.util.AttributeSet;
88
import android.view.View;
9+
import android.view.ViewParent;
910

1011
import java.util.ArrayList;
1112
import java.util.List;
@@ -17,6 +18,8 @@
1718
*/
1819
public class ConsecutiveViewPager extends ViewPager implements IConsecutiveScroller {
1920

21+
private int mAdjustHeight;
22+
2023
public ConsecutiveViewPager(@NonNull Context context) {
2124
super(context);
2225
}
@@ -25,6 +28,39 @@ public ConsecutiveViewPager(@NonNull Context context, @Nullable AttributeSet att
2528
super(context, attrs);
2629
}
2730

31+
@Override
32+
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
33+
if (isConsecutiveParent() && mAdjustHeight > 0) {
34+
ConsecutiveScrollerLayout layout = (ConsecutiveScrollerLayout) getParent();
35+
int parentHeight = layout.getMeasuredHeight();
36+
int height = Math.min(parentHeight - mAdjustHeight, getDefaultSize(0, heightMeasureSpec));
37+
super.onMeasure(widthMeasureSpec,
38+
View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.getMode(heightMeasureSpec)));
39+
} else {
40+
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
41+
}
42+
}
43+
44+
private boolean isConsecutiveParent() {
45+
ViewParent parent = getParent();
46+
if (parent instanceof ConsecutiveScrollerLayout) {
47+
ConsecutiveScrollerLayout layout = (ConsecutiveScrollerLayout) parent;
48+
return layout.indexOfChild(this) == layout.getChildCount() - 1;
49+
}
50+
return false;
51+
}
52+
53+
public int getAdjustHeight() {
54+
return mAdjustHeight;
55+
}
56+
57+
public void setAdjustHeight(int adjustHeight) {
58+
if (mAdjustHeight != adjustHeight) {
59+
mAdjustHeight = adjustHeight;
60+
requestLayout();
61+
}
62+
}
63+
2864
/**
2965
* 返回当前需要滑动的view。
3066
*
@@ -55,8 +91,6 @@ public List<View> getScrolledViews() {
5591
for (int i = 0; i < count; i++) {
5692
views.add(getChildAt(i));
5793
}
58-
} else {
59-
views.add(this);
6094
}
6195
return views;
6296
}

0 commit comments

Comments
 (0)