HorizontalScrollView: auto-scroll to end when new Views are added?

后端 未结 9 1134
鱼传尺愫
鱼传尺愫 2020-11-28 06:37

I have a HorizontalScrollView containing a LinearLayout. On screen I have a Button that will add new Views to the LinearLayout at runtime, and I\'d like the scroll view to

相关标签:
9条回答
  • 2020-11-28 07:11

    Just another sugestion, since this question helped me a lot :).

    You can put a listener when the view has finished its layout phase, and right after do the fullScroll althought you'll need to extend the class for that.

    I only did this because i wanted to scroll to a section right after onCreate() to avoid that flickering from starting point to scroll point.

    Something like:

    public class PagerView extends HorizontalScrollView {
    
        private OnLayoutListener mListener;
        ///...
        private interface OnLayoutListener {
            void onLayout();
        }
    
        public void fullScrollOnLayout(final int direction) {
            mListener = new OnLayoutListener() {            
                @Override
                public void onLayout() {
                     fullScroll(direction)
                     mListener = null;
                }
            };
        }
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            super.onLayout(changed, l, t, r, b);
            if(mListener != null)
                 mListener.onLayout();
        }
    }
    
    0 讨论(0)
  • 2020-11-28 07:14

    Use below code for horizontal scrollview {Scroll to right}

    view.post(new Runnable() {
                    @Override
                    public void run() {
                        ((HorizontalScrollView) Iview
                                .findViewById(R.id.hr_scroll))
                                .fullScroll(HorizontalScrollView.FOCUS_RIGHT);
                    }
                });
    
    0 讨论(0)
  • 2020-11-28 07:20

    I think there's a timing issue. Layout isn't done when a view is added. It is requested and done a short time later. When you call fullScroll immediately after adding the view, the width of the linearlayout hasn't had a chance to expand.

    Try replacing:

    s.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
    

    with:

    s.postDelayed(new Runnable() {
        public void run() {
            s.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
        }
    }, 100L);
    

    The short delay should give the system enough time to settle.

    P.S. It might be sufficient to simply delay the scrolling until after the current iteration of the UI loop. I have not tested this theory, but if it's right, it would be sufficient to do the following:

    s.post(new Runnable() {
        public void run() {
            s.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
        }
    });
    

    I like this better because introducing an arbitrary delay seems hacky to me (even though it was my suggestion).

    0 讨论(0)
提交回复
热议问题