PagerAdapter的起始位置


75

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

此示例的问题是我无法弄清楚如何设置起始位置,默认起始位置为0。基本上,我将无法控制左侧或右侧是否有可用视图。

有什么方法可以控制中心的“查看当前位置”?有更好的方法吗?有可能使其成为圆形吗?


Answers:


169

我找到了一种设置其位置的方法,该方法在课程之外进行:

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

可以通过计算要放入的物品数量来限制它


4
注意,如果awesomeAdapter由光标/ LoaderManager支持你需要小心的时候setCurrentItem被调用,以避免偷焦点(太迟),或未能在所有(为时过早)移动至页面-看到
rymo

不适用于我,因为那时我的其他片段还没有准备好,而且我有一个异常,因为我的应用尝试使用currentPosition尚未创建的片段中的变量
Zvi 2016年

工作完美。在片段准备就绪时设置视图分页器可以正常工作,在片段准备就绪并且您有当前位置时尝试此操作。感谢@Kirill
Naeem Ibrahim

有没有办法从开始ViewPager结束?我的意思是像在RecyclerView中那样进行设置new LinearLayoutManager(..., inverse=true)。我想要的是:ViewPager紧接着跳到最后一个项目,中间没有发火的片段
默特(Mort)'17

@murt已经很晚了,但是如果有人遇到同样的问题,则传递false不会向用户显示发生的过渡: viewPager.setCurrentItem(newPosition, false);
Yousef Gamal

20

我注意到,如果使用具有FragmentStatePagerAdapter的ViewPager重新创建Activity(方向更改),则Adapter将重用它的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);

确实需要延迟recreate() call!:)
anni

17

首先从最后一个片段开始:

PagerAdapter pagerAdapter = new PagerAdapter();
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(pagerAdapter.getCount() - 1);

9

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

确保您这样做:

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

并不是:

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

6

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

@Override
onResume(){
   super.onResume();
   viewPager.setCurrentItem(newPosition);
}

4

我正在使用3个片段,在启动我的应用程序时,默认情况下将显示第二个(中间)片段。只是我正在使用onResume函数,并且一切正常。

@Override
protected void onResume() {
    super.onResume();
    m_viewPager.setCurrentItem(1);
}

为我工作,而不是在onCreate中使用计时器。谢谢!
Gmeister4'6

不适用于我,因为我的第二个片段当时还没有准备好,而且我有一个异常,因为我的应用尝试使用尚未创建的第二个片段中的变量
Zvi 2016年

那么如何使用甚至没有创建的变量呢?
Leebeedev '16

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);
       }
} 

这样,也永远不会打扰延迟的时间设置。


2

使用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"

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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.