【问题标题】:Android PagerAdapter, get current positionAndroid PagerAdapter,获取当前位置
【发布时间】:2012-01-22 04:59:46
【问题描述】:

我想获取我的 PagerAdapter 可见视图的当前位置

我没有看到像 getPosition() 这样的明显功能,我想要一个。

我想在那个位置将一个对象添加到它的数组列表中,但我需要先知道它

【问题讨论】:

    标签: android arraylist pager android-viewpager


    【解决方案1】:

    你会使用:

    int position = mViewPager.getCurrentItem()
    

    【讨论】:

    • 我正在使用兼容包,它扩展了 PagerAdapter,也没有 getCurrentItem 方法。我怎样才能做一个? pastebin.com/LabjNvqL
    • 不,oncreate只在页面为0时在开始运行,在页面不为0时在其他地方使用它会返回该页码
    • @CQM 您正在使用 VIewPager,并且您正在将其适配器设置为该类,请告诉我您有 oncreate 的类
    • 好的,现在就在那里。我不得不更新我的兼容性包 =\ 这是一个非常令人沮丧的认识
    • @CQM 会很好地分享使它适合您的版本,然后编辑答案。
    【解决方案2】:

    我遇到了这个问题,无法获得getCurrentItem() 方法。

    我最终从ViewPager 而不是PageAdapter 获得了职位。 onPageSelected(int currentPage) 方法正在获取当前显示的页面。

    //custom PageAdapter implementation
    mAdapter = new AwesomePagerAdapter();
    
    //Our custom view pager that extends from ViewPager
    mPager = (CustomViewPager) findViewById(R.id.preview_gallery);
    
    mPager.setAdapter(mAdapter);
    
    // get the item that we should be showing from the intent
    mCurrentPage = extra.getInt("currentIndex");
    
    // show the item the user picked
    mPager.setCurrentItem(mCurrentPage);
    
    // listen for page changes so we can track the current index
    mPager.setOnPageChangeListener(new OnPageChangeListener() {
    
        public void onPageScrollStateChanged(int arg0) {
        }
    
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }
    
        public void onPageSelected(int currentPage) {
            //currentPage is the position that is currently displayed. 
        }
    
    });
    

    PageAdaper 中执行此操作对我不起作用,因为我想预加载不可见的图像。 PageAdapter`的instantiateItem(View collection, int position)传递的位置是下一个初始化项的位置。这与显示的项目无关。

    【讨论】:

    • 这是唯一有效的。 getCurrentItem() 不可靠。
    【解决方案3】:

    https://github.com/Shereef/ViewPagerPlusExpandableList/blob/master/src/net/shereef/vewpagerplusexpandablelistexample/ViewPagerPlusExpandableListActivity.java#L204

    如果我在那一行之后写

        Log.i("pager",myPager.getCurrentItem()+"");
    

    它会在 oncreate 运行时在 logcat 中显示当前项目页面,该页面始终为 0

    请注意,我已将对象用于 viewpager,它本身不是适配器。

    【讨论】:

    • 你是在告诉我它总是返回 0 吗?我不明白,它会告诉你一个准确的位置吗?
    • 好的,现在就在那里。我不得不更新我的兼容性包 =\ 这是一个非常令人沮丧的认识
    • 请选择jona的答案作为正确的答案,因为他首先回答了祝你好运
    【解决方案4】:

    这是我自己使用的更新解决方案。由于setOnPageChangeListener 现在已弃用,您必须使用addOnPageChangeListener

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                int counterPosition;
                if (position == 0 || position <= currentInventory.size()){
                    counterPosition = position + 1;
                } else {
                    counterPosition = position;
                }
    
                viewPagerHeader.setText("Prize " + counterPosition + " of " + currentInventory.size());
    
            }
    
            @Override
            public void onPageSelected(int position) {
    
            }
    
            @Override
            public void onPageScrollStateChanged(int state) {
    
            }
        });
    

    上面的实现在我的TextView 中显示了正确的索引,以便0 的位置和列表中的最后一项currentInventory.size() 正确显示。 希望这对寻找更新解决方案的人有所帮助。

    【讨论】:

      【解决方案5】:

      试试这个:

        imageSlider.addOnPageChangeListener(object: ViewPager.OnPageChangeListener{
                              override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
                              override fun onPageSelected(position: Int) {Log.d(TAG, "Page No.: $position")}
                              override fun onPageScrollStateChanged(state: Int) {}
                          })
      

      【讨论】:

        【解决方案6】:

        我昨天刚遇到这个问题。当页面对用户可见而不是之前,我需要在每个页面中开始播放动画。

        我的适配器继承自PagerAdapter,我发现有一个函数setPrimaryItem(),每次将页面作为当前页面显示给用户时都会触发。

        调用以通知适配器当前认为哪个项目是“主要”,即作为当前页面显示给用户的一个。当适配器不包含任何项时,不会调用此方法。

        不仅你有一个页面可见的回调,而且这个回调还提供了当前页面的位置。

        class MyAdapter extends PagerAdapter {
        
            @Override
            public int getCount() {
                ...
            }
        
            @Override
            public boolean isViewFromObject(@NonNull @NotNull View view, @NonNull @NotNull Object object) {
                ...
            }
        
            @Override
            public void setPrimaryItem(@NonNull @NotNull ViewGroup container, int position, @NonNull @NotNull Object object) {
                super.setPrimaryItem(container, position, object);
        
                // `position` gives you the position of the current page
        
                // And this is how I managed to play the animation (Lottie library) when the page is visible to the user
                LottieAnimationView animation = ((ViewGroup) object).findViewById(R.id.my_animation_view);
                animation.playAnimation();
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2011-07-15
          • 1970-01-01
          • 1970-01-01
          • 2018-12-21
          • 2016-07-30
          • 1970-01-01
          • 2012-03-05
          • 2017-04-01
          相关资源
          最近更新 更多