PagerAdapter开始位置

时间:2012-08-09 08:17:59

标签: android android-viewpager swipe

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

这个例子的问题是我无法弄清楚如何设置我的起始位置,默认的起始位置是0.基本上我不能控制左边是否有可用的视图或正确的。

有没有办法控制中心的查看当前位置?有更好的方法吗? 是否有可能使其圆形?

9 个答案:

答案 0 :(得分:147)

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

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

可以通过计算我想要适合的项目数来限制它

答案 1 :(得分:15)

我注意到如果使用具有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 alwayes首先打开第0页并设置setCurrentItem(CurrentPosition);不起作用。修复此问题是延迟后更改页面:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        viewPager.setCurrentItem(newPosition);
    }
}, 100);

答案 2 :(得分:14)

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

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

答案 3 :(得分:8)

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

确保你这样做:

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

而不是:

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

答案 4 :(得分:6)

我有一个大小超过1000的数组,在dymanic viewpager中我遇到了leftswipe卡在firstload上。下面的代码解决了这个问题并导致平滑滚动:

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

答案 5 :(得分:4)

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

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

答案 6 :(得分:2)

我遇到了同样的问题。 初始化ViewPager时,指标位置为0。 这可能取决于寻呼机内容的计算量。我使用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);
       }
} 

通过这种方式,也永远不会为时间设置延迟而烦恼。

答案 7 :(得分: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;
}

答案 8 :(得分:0)

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