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, который необходимо наблюдать. Это как-то похоже на какую-то проблему, связанную с этим.

Заранее спасибо!

584   2  

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

    Ничего не найдено.