77

我正在使用以下示例来暗示我的 viewPager: http ://code.google.com/p/viewpagerexample/issues/list

这个例子的问题是我不知道如何设置我的起始位置,默认起始位置是 0。基本上我无法控制它的左侧或右侧是否有可用的视图。

有没有办法控制中心的查看当前位置?有更好的方法吗?能不能做成圆形?

4

9 回答 9

174

我找到了一种设置它的位置的方法,这是在课堂之外完成的:

 awesomePager = (ViewPager) findViewById(R.id.awesomepager);
 awesomePager.setAdapter(awesomeAdapter);
 awesomePager.setCurrentItem(CurrentPosition);

并且可以通过计算我想要放入其中的项目数量来限制它

于 2012-08-09T10:00:17.893 回答
20

我注意到,如果您使用具有 FragmentStatePagerAdapter 的 ViewPager 重新创建 Activity(方向更改),则适配器将重用它的 Fragments。阻止它的方法是:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    if (viewPager != null) {
        // before screen rotation it's better to detach pagerAdapter from the ViewPager, so
        // pagerAdapter can remove all old fragments, so they're not reused after rotation.
        viewPager.setAdapter(null);
    }
    super.onSaveInstanceState(savedInstanceState);
}

但是在 Activity 重新创建之后 ViewPager 总是先打开第 0 页并 setCurrentItem(CurrentPosition); 不起作用。修复延迟后更改页面的问题:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        viewPager.setCurrentItem(newPosition);
    }
}, 100);
于 2013-12-10T13:13:06.433 回答
17

从最后一个片段开始,我这样做了:

PagerAdapter pagerAdapter = new PagerAdapter();
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(pagerAdapter.getCount() - 1);
于 2015-03-11T14:33:07.017 回答
10

我遇到了一个问题,如果我在设置适配器之前设置当前项目,我得到的第一个项目将始终是位置 0 的项目。

确保你这样做:

awesomePager.setAdapter(awesomeAdapter);
awesomePager.setCurrentItem(CurrentPosition);

并不是:

awesomePager.setCurrentItem(CurrentPosition);
awesomePager.setAdapter(awesomeAdapter);
于 2013-11-25T22:19:41.287 回答
6

我有一个大小超过 1000 的数组,在动态查看器中,我面临左滑卡在 firstload 上。下面的代码解决了这个问题并导致平滑滚动:

@Override
onResume(){
   super.onResume();
   viewPager.setCurrentItem(newPosition);
}
于 2015-11-03T07:09:25.200 回答
5

我正在使用 3 个片段,在启动我的应用程序时,默认情况下会显示第二个(中间)片段。只是我正在使用 onResume 功能,一切都很好。

@Override
protected void onResume() {
    super.onResume();
    m_viewPager.setCurrentItem(1);
}
于 2014-11-28T21:46:31.453 回答
3

使用viewPager.setCurrentItem(newPosition);向用户显示从起始页到 的过渡newPosition,以防止这种情况发生并newPosition直接显示它,就好像它是起点一样,我false在第二个参数中添加了如下内容:

int newPosition = pages.size()-1; // Get last page position

viewPager.setCurrentItem(newPosition, false); // 2nd parameter (false) stands for "smoothScroll"
于 2019-10-05T01:15:25.333 回答
2

我遇到了同样的问题。当我初始化 ViewPager 时,指示器位置为 0。这可能取决于 Pager 内容的计算量。我使用 ViewTreeObserver 如下所示。

mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        mViewPager.setCurrentItem(newPosition);
        removeOnGlobalLayoutListener(mSlidingTabLayout.getViewTreeObserver(), mGlobalLayoutListener);
    }
};
mSlidingLayout.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);

和,

private void removeOnGlobalLayoutListener(ViewTreeObserver observer, ViewTreeObserver.OnGlobalLayoutListener listener) {
       if (observer == null) return;
       if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
               observer.removeGlobalOnLayoutListener(listener);
       } else {
               observer.removeOnGlobalLayoutListener(listener);
       }
} 

这样一来,也再也不用为延迟的时间设置而烦恼了。

于 2015-11-11T10:05:09.827 回答
1
@Override
public Object instantiateItem(ViewGroup container, int position) {
    View currentPage = null;
    switch(position){
        case 0:
            currentPage = LayoutInflater.from(context).inflate(R.layout.page0, null)    
            break;
        case 1:
            currentPage = LayoutInflater.from(context).inflate(R.layout.page1, null)    
            ///////////// This page will be default ////////////////////
            ((ViewPager)container).setCurrentItem(position);
            ////////////////////////////////////////////////////////////
            break;
        case 2:
            currentPage = LayoutInflater.from(context).inflate(R.layout.page2, null)    
            break;
    return currentPage;
}
于 2014-09-02T10:39:16.183 回答