所以我有一个带有视图寻呼机的活动,它会膨胀大约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;
}
}
};
我想知道是否有更好更稳定的方式来实现类似的目标。
先谢谢。
答案 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
。