在ViewPager中的所有片段之间同步ScrollView的Scroll位置

时间:2015-08-12 20:14:03

标签: android android-fragments android-viewpager scrollview

所以我有一个带有视图寻呼机的活动,它会膨胀大约7个碎片,每个碎片里面都有一个ScrollView,我想同步所有7个滚动视图的滚动,所以如果用户滚动到碎片3上的一个位置,移动到片段5它们应该在完全相同的位置,滚动视图会使相同的子节点膨胀,因此在所有7个片段中,scrollview的总高度是恒定的。

我去某种系统工作,但是它的命中或错过,我得到列表的滚动位置并广播位置和空闲的片段消耗广播,我保存活动的位置也可以在onResume中请求尚未充气的片段。这是我的代码:

@Override
public void onResume() {
    super.onResume();
    mParentScrollView.setScrollY(mParentActivity.getScrollPos());
}

@Override
public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldX, int oldY) {
    mScrollListener.onScroll(y);
    mParentActivity.setScrollPos(y);
    if (callbackSwitch) {
        Intent intent = new Intent("ACTION_SCROLL");
        intent.putExtra("TRANSLATION", y);
        LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent);
    }
    callbackSwitch = true; //Switch to stop recursive calls
}

private BroadcastReceiver mTranslationReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (!isVisible) {
            int translation = intent.getIntExtra("TRANSLATION", 0);
            mParentScrollView.setScrollY(translation);
            callbackSwitch = false;
        }
    }
};

我想知道是否有更好更稳定的方式来实现类似的目标。

先谢谢。

1 个答案:

答案 0 :(得分:0)

不确定这个解决方案有多优雅,但它应该可以解决问题。扩展ViewPager并覆盖onMeasure(int, int)方法。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int height = 0;
    for (int i = 0; i < getChildCount(); i++) {
        View child = getChildAt(i);
        child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        int h = child.getMeasuredHeight();
        if (h > height) height = h;
    }
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

我的自定义ViewPager位于NestedScrollView内,并且两个子片段不包含任何其他ScrollView