One option is to create an ObservableScrollView that has a scroll listener. Google uses this approach in the IOSched14 app. One way of creating this might be:
public class ObservableScrollView extends ScrollView {
private boolean mScrollingEnabled = true;
private ArrayList<Callbacks> mCallbacks = new ArrayList<Callbacks>();
public ObservableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
for (Callbacks c : mCallbacks) {
c.onScrollChanged(l - oldl, t - oldt);
}
}
@Override
public int computeVerticalScrollRange() {
return super.computeVerticalScrollRange();
}
public void addCallbacks(Callbacks listener) {
if (!mCallbacks.contains(listener)) {
mCallbacks.add(listener);
}
}
public static interface Callbacks {
public void onScrollChanged(int deltaX, int deltaY);
}
public void setScrollingEnabled(boolean scrollingEnabled) {
mScrollingEnabled = scrollingEnabled;
}
// @Override
// public boolean onTouchEvent(MotionEvent ev) {
// if (!mScrollingEnabled) return false;
// return super.onTouchEvent(ev);
// }
}
Simply add this instead of your ScrollView and then attach a listener using the addCallbacks method:
ObservableScrollView scrollView = new ObservableScrollView(context);
scrollView.addCallbacks(this);