gpt4 book ai didi

android - 在 ViewPager 中同步 fragment 滚动

转载 作者:太空狗 更新时间:2023-10-29 16:17:20 25 4
gpt4 key购买 nike

我正在尝试复制类似 Yahoo! Weather app 的东西,但我完全不知道如何在 ViewPager 中同步所有相同高度的 ScrollView 。

我在 fragment 中使用 ScrollListener 来设置背景的不透明度并更新其他 fragment

final ViewTreeObserver.OnScrollChangedListener onScrollChangedListener = new ViewTreeObserver.OnScrollChangedListener() {

@Override
public void onScrollChanged() {
if(scrollView.getScrollY() > 0 && scrollView.getScrollY() < 1200) {
overlay.getBackground().setAlpha((scrollView.getScrollY()/4));

if(isVisible()) {
Activity parent = getActivity();
if(parent != null && parent instanceof MainActivity) {
((MainActivity)parent).updateHeight(scrollView.getScrollY());
}
}
}
}
};

在 MainActivity 中我正在做这样的事情:

public void updateHeight(int scroll) {
for(int i = 0; i<mPager.getChildCount(); i++) {
View v = mPager.getChildAt(i);
ScrollView scrollView = (ScrollView) v.findViewById(R.id.frag_scrollview);
scrollView.setScrollY(scroll);
}
}

这“几乎”可以工作,但不是真的。

我试图修改代码以避免更新当前可见页面,但没有成功:

if(i != mPager.getCurrentItem()) {
View v = mPager.getChildAt(i);
ScrollView scrollView = (ScrollView) v.findViewById(R.id.frag_scrollview);
scrollView.setScrollY(scroll);
}

PS:为了在 ScrollView 上获取更新,我也不太确定正确的模式。 OnScrollChangedListener 似乎有效,但它被调用了很多次,所以我不确定它是否是正确的方法。

提前致谢。

最佳答案

更新:

我刚刚在 gradle/maven 上发布了这个解决方案(SynchronizedScrollView)!
它也有一些修复和与上次发布的不同之处,所以无论如何都要检查代码!

请随意使用它并做出贡献!谢谢。 :)


好的,我已经更改了应用程序的所有结构并修复了这部分,这比预期的要容易。

刚刚在几分钟内进行了测试,所以这可能有问题,但似乎工作得很好。我基本上创建了一个类,它将保持同步所有 ScrollView 的责任,并且 ScrollView 只是在滚动时通知这个同步器。

public class Synchronizer {

private static Synchronizer instance;

private List<Synchronizable> synchronizableList;

private Synchronizer() {}

public static Synchronizer getInstance() {
if (instance == null)
instance = new Synchronizer();
return instance;
}

public void registerSynchronizable(Synchronizable synchronizable) {
if(synchronizableList == null)
synchronizableList = new ArrayList<>();

synchronizableList.add(synchronizable);
}

public void update(Synchronizable sender, int update) {
if(update < 0) update = 0;

for(Synchronizable s : synchronizableList) {
if(s != sender)
s.onUpdate(update);
}
}

public interface Synchronizable {
public void onUpdate(int update);
}
}

并且 ScrollView 将实现 Synchronizable 接口(interface),并且它们将在创建时“注册”

public class MyScrollView extends ScrollView implements Synchronizer.Synchronizable {

public MyScrollView(Context context) {
super(context);
init();
}

public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}

private void init() {
// init your ScrollView with style and stuff and then register it

Synchronizer.getInstance().registerSynchronizable(this);
}

@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);

// listen for "your" scrolls and notify the Synchronizer
Synchronizer.getInstance().update(this, getScrollY());
}

@Override
public void onUpdate(int update) {
// listen for the scrolls of your "siblings" from the Synchronizer
setScrollY(update);
}
}

希望这会有所帮助!

关于android - 在 ViewPager 中同步 fragment 滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23747758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com