7

ScrollView .scrollTo が機能しないのと同じ問題ですか? 回転時に ScrollView の位置を保存する

onCreate の scrollView にアイテムを動的に追加します。すべてのアイテムが追加された後、次のことを試します。

    // no effect
    ScrollView mainScroll = (ScrollView) findViewById(R.id.average_scroll_mainScroll);

    // no effect
    ScrollView mainScroll = (ScrollView) findViewById(R.id.average_scroll_mainScroll);
    mainScroll.post(new Runnable() {
        public void run(){
            ScrollView mainScroll = (ScrollView) findViewById(R.id.average_scroll_mainScroll);
            mainScroll.scrollTo(0, 0);
        } 
    });

    // works like a charm
    ScrollView mainScroll = (ScrollView) findViewById(R.id.average_scroll_mainScroll);
    mainScroll.postDelayed(new Runnable() {
        public void run(){
            ScrollView mainScroll = (ScrollView) findViewById(R.id.average_scroll_mainScroll);
            mainScroll.scrollTo(0, 0);
        } 
    }, 30);

「DOM-ready」のようなイベントがあると思いますか? コールバックはありますか?

4

4 に答える 4

19

この質問に対してDavid Daudelinが提供した回答に従って、ScrollViewを拡張して独自のものを作成する必要はありません。

の を取得し、ViewTreeObserverScrollViewを追加OnGlobalLayoutListenerViewTreeObserverます。ScrollView.scrollTo(x,y)次に、 のメソッドからメソッドをonGlobalLayout()呼び出しますOnGlobalLayoutListener。コード:

 ScrollView mainScroll = (ScrollView) findViewById(R.id.average_scroll_mainScroll);

 ViewTreeObserver vto = scrollView.getViewTreeObserver();
 vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
      public void onGlobalLayout() {
           mainScroll.scrollTo(0, 0);
      }
 });
于 2013-09-21T08:02:00.447 に答える
1

ScrollView に何らかの変更を加えると、レイアウトの変更が表示リストに複製され、ScrollView に特定の位置までスクロールできることを通知するまでに時間がかかります。

独自の ScrollView で拡張し、必要に応じて (MH の提案に従って) を追加し、後でスクロールScrollViewするメソッドを追加することで、なんとか機能させることができました。OnGlobalLayoutListener必要なすべてのケースに適用するよりも少し自動化されています (ただし、 new を使用する必要がありますScrollView)。とにかく、これは関連するコードです:

public class ZScrollView extends ScrollView {

    // Properties
    private int desiredScrollX = -1;
    private int desiredScrollY = -1;
    private OnGlobalLayoutListener gol;

    // ================================================================================================================
    // CONSTRUCTOR ----------------------------------------------------------------------------------------------------

    public ZScrollView(Context __context) {
        super(__context);
    }

    public ZScrollView(Context __context, AttributeSet __attrs) {
        super(__context, __attrs);
    }

    public ZScrollView(Context __context, AttributeSet __attrs, int __defStyle) {
        super(__context, __attrs, __defStyle);
    }

    // ================================================================================================================
    // PUBLIC INTERFACE -----------------------------------------------------------------------------------------------

    public void scrollToWithGuarantees(int __x, int __y) {
        // REALLY Scrolls to a position
        // When adding items to a scrollView, you can't immediately scroll to it - it takes a while
        // for the new addition to cycle back and update the scrollView's max scroll... so we have
        // to wait and re-set as necessary

        scrollTo(__x, __y);

        desiredScrollX = -1;
        desiredScrollY = -1;

        if (getScrollX() != __x || getScrollY() != __y) {
            // Didn't scroll properly: will create an event to try scrolling again later

            if (getScrollX() != __x) desiredScrollX = __x;
            if (getScrollY() != __y) desiredScrollY = __y;

            if (gol == null) {
                gol = new OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        int nx = desiredScrollX == -1 ? getScrollX() : desiredScrollX;
                        int ny = desiredScrollY == -1 ? getScrollY() : desiredScrollY;
                        desiredScrollX = -1;
                        desiredScrollY = -1;
                        scrollTo(nx, ny);
                    }
                };

                getViewTreeObserver().addOnGlobalLayoutListener(gol);
            }
        }
    }
}

追加した直後に ScrollView 内の特定の View にスクロールしたかったので、私にとって非常に便利です。

于 2012-11-30T22:06:36.843 に答える