【问题标题】:PagerAdapter start positionPagerAdapter 起始位置
【发布时间】:2012-08-09 08:17:58
【问题描述】:

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

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

有什么方法可以控制中心的查看当前位置吗?有更好的方法吗? 可以做成圆形吗?

【问题讨论】:

标签: android android-viewpager swipe


【解决方案1】:

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

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

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

【讨论】:

  • 请注意,如果 awesomeAdapter 由 Cursor/LoaderManager 支持,则需要注意何时调用 setCurrentItem 以避免窃取焦点(为时已晚)或无法将页面移动到全部(太早) - 见this
  • 对我不起作用,因为那时我的其他片段还没有准备好,我遇到了一个异常,因为我的应用程序尝试使用尚未创建的 currentPosition 片段中的变量
  • 工作完美。在片段准备好时设置视图寻呼机工作正常,在片段准备好并且您有当前位置可用时尝试此操作。谢谢@Kirill
  • 有没有办法从end开始ViewPager?我的意思是,就像在 RecyclerView 中一样,当您设置 new LinearLayoutManager(..., inverse=true) 时。我想要的是:ViewPager 立即跳转到最后一项,中间没有触发片段
  • @murt 已经很晚了,但如果有人遇到同样的问题,传递 false 不会向用户显示发生的转换:viewPager.setCurrentItem(newPosition, false);
【解决方案2】:

我注意到,如果您使用具有 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 之后确实需要延迟! :)
【解决方案3】:

从我做的最后一个片段开始:

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

【讨论】:

    【解决方案4】:

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

    确保你这样做:

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

    而不是:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 为我工作,而不是在 onCreate 中使用计时器。谢谢!
        • 对我不起作用,因为我的第二个片段当时还没有准备好,我遇到了一个异常,因为我的应用程序试图使用来自第二个片段的变量,但尚未创建
        • 那么你怎么能使用一个甚至没有创建的变量呢?!
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          我遇到了同样的问题。 当我初始化 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);
                 }
          } 
          

          这样一来,也再也不用担心时间设置的延迟了。

          【讨论】:

            【解决方案9】:
            @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;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-01-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-07-29
              • 1970-01-01
              • 1970-01-01
              • 2016-07-07
              相关资源
              最近更新 更多