Android onScrollChanged для Scrollview выстрелил несколько раз
Я схожу с ума от этой проблемы, копаясь в ней уже с 4 часов, и я думаю, что не могу снова сосредоточиться, так что извините,если это легко.
В основном я хочу отслеживать ScrollY на Scrollview (нет, я не могу использовать сетку или список)
Я использую ViewTreeObserver с Прослушивателем onScrollChanges для него. Однако его увольняют несколько раз. Еще хуже: когда он вызывается 3 из 4 раз, scrollY scrollview равен 0 и 1 раз я получаю правильный ответ. сумма. Тем не менее, это не так, как каждый 4-й вызов является правильным, момент, когда правильное значение срабатывает случайным образом, и мне нужно быть в состоянии слушать scrollposition 0.
Вот код, который я использую для наблюдения моего Scrollview:
mScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
Log.d("StupidScrollView", "Scroll positionY: " + mScrollView.getScrollY());
}
});
Пример вывода:
D/StupidScrollView﹕ Scroll positionY: 0
D/StupidScrollView﹕ Scroll positionY: 0
D/StupidScrollView﹕ Scroll positionY: 0
D/StupidScrollView﹕ Scroll positionY: 77
Я должен упомянуть, что я нахожусь в ViewPager, и мои фрагменты содержат Scrollview, который необходимо наблюдать. Это как-то похоже на какую-то проблему, связанную с этим.
Заранее спасибо!
2 ответов:
Я вижу вашу проблему, у меня самого было много проблем с просмотром свитков.. Вот мое решение, чтобы получить scrollvalue в scrollview (я добавил систему.из-за тебя).
Сначала создайте пользовательский класс, который расширяет ScrollView, и создайте прослушиватель, который имеет метод onScrollChanged, как здесь:
public class ProductDetailScrollView extends ScrollView { public interface OnScrollChangedListener { void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt); } private OnScrollChangedListener mOnScrollChangedListener; public void setOnScrollChangedListener(OnScrollChangedListener listener) { mOnScrollChangedListener = listener; } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); if (mOnScrollChangedListener != null) { mOnScrollChangedListener.onScrollChanged(this, l, t, oldl, oldt); } } public ProductDetailHorizontalScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public ProductDetailHorizontalScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public ProductDetailHorizontalScrollView(Context context) { super(context); } }Затем я создаю переменную (в действии) mOnScrollChangedListener и устанавливаю ее в качестве прослушивателя для mScrollView:
private ProductDetailScrollView.OnScrollChangedListener mOnScrollChangedListener = new ProductDetailScrollView.OnScrollChangedListener() { public void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt) { System.out.println("Scrolled: " + t); //Parallax Effect on scroll if (t > 0) { final float newY = (t / 4.0f) * -1.0f; mProductImageContainer.setY(newY); } else { mProductImageContainer.setY(0.0f); } } };Значение" t " в моем случае - это сколько прокрутка изменилась по вертикали, "l" - это горизонтальная прокрутка, а" oldl "и" oldt " - это старое значение t & l, поэтому, если вам нужно знать, что он прокручивается вверх или вниз, вы можете использовать if(oldt > t) и т. д..
И вы устанавливаете прослушиватель в своем scrollview следующим образом:
mScrollView.setOnScrollChangedListener(mOnScrollChangedListener);
У меня была та же проблема. Я заменил свой
ScrollViewнаandroid.support.v4.widget.NestedScrollView.Затем реализуется
NestedScrollView.OnScrollChangeListener.Прикрепил слушателя к моему
NestedScrollView.И теперь я обнаруживаю изменения прокрутки. :)
Comments