その他
    ホーム 技術発信 DoRuby AndroidのScrollViewでスクロールの位置が変わったのを取得する方法

    AndroidのScrollViewでスクロールの位置が変わったのを取得する方法

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    AndroidのListViewでスクロールの位置が変わったのを取得する際は、ListViewにOnScrollListenerをセットしてあげれば取得することができます。

    ならScrollViewでも同じようにOnScrollListenerをセットすれば、スクロールの位置が変わったのを取得できる、、と思いきやそうもいきません。

    ScrollViewの場合は、ScrollViewを継承してスクロールの位置が変わったのを取得できるScrollViewを作ります。

    public class ObservableScrollView extends ScrollView {
        
        public interface ScrollViewListener {
            void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);
        }
        
        private HorizontalScrollViewListener scrollViewListener = null;
    
        public ObservableHorizontalScrollView(Context context) {
            super(context);
        }
        
        public ObservableHorizontalScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
        
        public ObservableHorizontalScrollView(Context context, AttributeSet attrs, int defs) {
            super(context, attrs, defs);
        }
        
        public void setOnScrollViewListener(HorizontalScrollViewListener scrollViewListener) {
            this.scrollViewListener = scrollViewListener;
        }
    
        @Override
        protected void onScrollChanged(int x, int y, int oldx, int oldy) {
            super.onScrollChanged(x, y, oldx, oldy);
            if (scrollViewListener != null) {
                scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
            }
        }
    }
    

    ポイントは、Activityなどのスクロールの位置が変わったのを伝えるためのInterfaceを用意するのと、

    それを onScrollChanged(int x, int y, int oldx, int oldy)の中に組み込むことです。

    ちなみにiPhoneならUIScrollViewのDelegateをセットすれば、- (void)scrollViewDidScroll:(UIScrollView *)scrollViewでスクロールの位置が変わったのを取得できます。

    なんて、面倒くさいのでしょう!

    記事を共有