Android scrollview onScrollChanged

Ste*_*teD 23 android android-scrollview onscrollchanged

我在滚动视图中的文本视图中有一个固定的内容.当用户滚动到某个位置时,我想开始一个活动或触发一个Toast.

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent" android:layout_height="fill_parent"
 android:id="@+id/scroller">
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical" android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <TextView android:layout_width="fill_parent" android:id="@+id/story"
   android:layout_height="wrap_content" android:text="@string/lorem"
   android:gravity="fill" />
 </LinearLayout>
</ScrollView>
Run Code Online (Sandbox Code Playgroud)

我的问题是实现受保护的方法onScrollChanged来找出滚动视图的位置.

我找到了这个答案,是否有一个更简单的解决方案,而不是声明一个界面,覆盖滚动视图等,如我发布的链接上所示?

Shu*_*uri 48

有一种比子类化更简单的方法ScrollView.该ViewTreeObserver对象ScrollView可用于侦听滚动.

由于ViewTreeObserver对象可能的寿命期间改变ScrollView,我们需要注册一个OnTouchListenerScrollView拿到它ViewTreeObserver的滚动时间.

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

    @Override
    public void onScrollChanged() {
        //do stuff here 
    }
};

final ScrollView scrollView = (ScrollView) findViewById(R.id.scroller);
scrollView.setOnTouchListener(new View.OnTouchListener() {
    private ViewTreeObserver observer;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (observer == null) {
            observer = scrollView.getViewTreeObserver();
            observer.addOnScrollChangedListener(onScrollChangedListener);
        }
        else if (!observer.isAlive()) {
            observer.removeOnScrollChangedListener(onScrollChangedListener);
            observer = scrollView.getViewTreeObserver();
            observer.addOnScrollChangedListener(onScrollChangedListener);
        }

        return false;
    }
});
Run Code Online (Sandbox Code Playgroud)


Com*_*ish 13

没有.

ScrollView不提供滚动事件的监听器,甚至不提供检查用户滚动距离的方法,因此您必须执行链接建议的操作.

  • onScrollChanged有一个可以覆盖的方法.可以使用Likelwise getScrollX,getScrollY. (14认同)
  • 现在看来这个答案是无效的。从 API 23 (M) 开始,有一个名为 "OnScrollChangeListener" scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() { @Override public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { //使用参数 } }); (2认同)

Lov*_*vis 9

这个问题相当陈旧,但万一有人匆匆离开(像我一样):

与开始API 23,Android的View拥有OnScrollChangeListener匹配二传手.

支持库中的NestedScrollView还支持在该API级别之前设置滚动侦听器.据我所知,NestedScrollView可以用来替代正常ScrollView而没有任何问题.


tul*_*84z 8

实际上有一种方法可以知道用户滚动了多远.ScrollView中的方法getScrollY()告诉你.

  • 我在公司的一个项目中使用了这个解决方案.我在这里发布之前测试了一切.也许你应该这样做? (3认同)