TitlePageIndicator标题与PagerAdapter.getPageTitle(int)不同

时间:2012-08-09 20:32:41

标签: android android-viewpager viewpagerindicator

我注意到的问题发生在用户滚动到ViewPager中的下一个(或上一个)页面时,会触发ViewPager向该页面设置(确认?)。除非用户在ViewPager仍处于稳定状态时开始拖动,否则此操作非常有效。在这种情况下,我得到的是TitlePageIndicator显示的标题显示了之后(或之前)2页的标题,而ViewPager显示的内容显示了下一页(或上一页) 。

如果用户在该页面之后开始滑动 - 标题和内容不匹配的页面已经确定,则标题会快速更新为正确的标题。看ViewPager.OnPageChangeListener他们说“有用于发现用户何时开始拖动,当寻呼机自动安排到当前页面时”onPageScrollStateChanged(int),这似乎是问题所在,但我没有'找到了一种方法来使用该方法解决问题。

我正在使用Jake Wharton com.viewpagerindicator.TitlePageIndicatorandroid.support.v4.view.ViewPager来呈现日历日。向左/向右滑动可移至上一个/下一个日历日。这意味着我的ViewPager设置为基于3 Fragments实现无限分页,分别对应于可见日,可见日前一天和可见日后一天。

我的ViewPager.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页

修改 有没有办法强制TitlePageIndicator再次调用getPageTitle(int)以正确的标题重新绘制标题?

1 个答案:

答案 0 :(得分: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())。



编辑:我的解决方案仅在向后滚动时才有效,而不是。