2

私が気付いている問題は、ユーザーが の次の (または前の) ページにスクロールしたときに発生し、そのページへの の解決 (確認?)ViewPagerがトリガーされます。が安定しViewPagerている間にユーザーがドラッグを開始しない限り、これは完全に機能します。ViewPagerこのシナリオでは、次の (または前の) ページをTitlePageIndicator表示しているときに、2 ページ後 (または前) のタイトルが表示されViewPagerます。

そのページ (タイトルとコンテンツが一致していないページ) が落ち着いた後にユーザーがスワイプを開始すると、タイトルはすぐに正しいタイトルに更新されます。ViewPager.OnPageChangeListener「ユーザーがドラッグを開始したとき、ページャーが現在のページに自動的に落ち着いているときを発見するのに役立ちます」と言っているのを見るとonPageScrollStateChanged(int)、これが問題のようですが、解決する方法を使用する方法が見つかりませんでした問題。

私は Jake Wharton のcom.viewpagerindicator.TitlePageIndicatorwithandroid.support.v4.view.ViewPagerを使用して、カレンダーの日のビューをレンダリングしています。左/右にスワイプすると、前/次の暦日に移動します。これは、可視日、可視日の前日、可視日の翌日に対応するViewPager3 つに基づいて無限のページネーションを実装するように my が設定されていることを意味します。Fragments

MyViewPager.OnPageChangeListenerはこのように構成され、TitlePageIndicator

_title.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        private int _focused_page = _VISIBLE;
        private boolean _is_settling = false;

        @Override
        public void onPageScrollStateChanged(int state) {
            if (state == ViewPager.SCROLL_STATE_IDLE) {
                if (_focused_page == _PREVIOUS)
                    moveToPrevious();
                else if (_focused_page == _NEXT)
                    moveToNext();

                // always set to middle page to continue to be able to
                // scroll left/right
                if (_paginator.getCurrentItem() != _VISIBLE)
                    _paginator.setCurrentItem(_VISIBLE, false);
                _is_settling = false;
            } else if (state == ViewPager.SCROLL_STATE_DRAGGING && _is_settling) {
                Ln.d("Double scrolled!");
                _title.setCurrentItem(_paginator.getCurrentItem());
                _title.invalidate();
            } else if (state == ViewPager.SCROLL_STATE_SETTLING) {
                _is_settling = true;
            }
        }

        @Override
        public void onPageSelected(int position) {
            _focused_page = position;
        }
});

私は約3つの解決策があると思います

  • 決済中のユーザー ドラッグ イベントの送信または応答を無効にする
  • 整定中にドラッグが発生したときに通知し、無効になった後に正しいタイトルを回復する
  • ViewPager最初のドラッグのように 2 回目のドラッグで を移動すると、すべてが元の表示日より 2 ページ後 (または前) になります。

編集:正しいタイトルでタイトルを再描画するために再度TitlePageIndicator呼び出す ように強制する方法はありますか?getPageTitle(int)

4

1 に答える 1

1

最初の実装のおかげで、解決策を見つけました。

private static final int PAGE_LEFT = 0;
private static final int PAGE_MIDDLE = 1;
private static final int PAGE_RIGHT = 2;

mTitleIndicator.setOnPageChangeListener(new OnPageChangeListener() {
            private boolean isSettling;
            private int focusedPage = 1;

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                focusedPage = position;
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                if (sViewPager.getChildAt(PAGE_RIGHT) != null) {
                    if (state == ViewPager.SCROLL_STATE_IDLE) {

                        // User swiped in right direction, change to left page.
                        if (focusedPage == PAGE_LEFT) {
                            doSomething();

                            // User swiped in left direction, change to right page.
                        } else if (focusedPage == PAGE_RIGHT) {
                            doSomething();
                        }
                        mTitleIndicator.setCurrentItem(PAGE_MIDDLE, false);
                        isSettling = false;

                    } else if (state == ViewPager.SCROLL_STATE_DRAGGING && isSettling) {
                        mTitleIndicator.notifyDataSetChanged();

                    } else if (state == ViewPager.SCROLL_STATE_SETTLING) {
                        isSettling = true;
                    }
                } else {
                    mTitleIndicator.setCurrentItem(PAGE_MIDDLE, false);
                }
            }
        });

編集:TitlePageIndicatorにgetPageTitle(int)を再度呼び出して、正しいタイトルでタイトルを再描画するように強制する方法はありますか?

はい、呼び出しますTitlePageIndicator.notifyDataSetChanged()(呼び出しのみinvalidate())。



編集:私の解決策は、前後にスクロールしたときにのみ機能します。

于 2013-02-01T14:05:54.957 に答える