Android PagerAdapter,获取当前位置

32

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

我没有看到像 getPosition() 这样明显的函数,但我需要一个。

我想在该位置将一个对象添加到其 ArrayList 中,但我需要先知道它的位置。

6个回答

57
您将使用:

您将使用:

int position = mViewPager.getCurrentItem()

2
我正在使用兼容包,并且它扩展了PagerAdapter,但是也没有getCurrentItem方法。我该如何创建一个?http://pastebin.com/LabjNvqL - CQM
1
好的,现在它在那里了。我不得不更新我的兼容性包 =\ 那是一个非常令人沮丧的体验。 - CQM
@CQM 可以分享一下哪个版本让你成功了,然后再编辑答案。 - philipp
我确保我的Android SDK管理器告诉我这是最新版本,然后我确保它被实现。但对我来说没有用。我在ViewPager中实现了逻辑(请参阅我的答案)。对我来说这听起来更有逻辑性,因为适配器没有直接处理视图。 - philipp
@philipp 你需要将android-sdk\extras\android\compatibility\v4库从中复制到你的项目中。SDK管理器不会更新你的项目。 - Jona
显示剩余3条评论

25

我也遇到了同样的问题,无法获取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中这样做对我来说不起作用,因为我想预加载那些没有显示出来的图片。在instantiateItem(View collection, int position)中传递的位置是下一个初始化的项的位置,这与显示的项无关。


这是唯一可行的方法。getCurrentItem()不可靠。 - Avijit

3

你是在告诉我它总是返回0吗?我不理解,它会告诉你一个准确的位置吗? - CQM
好的,现在它已经在那里了。我不得不更新我的兼容性包 =\ 那是一个非常令人沮丧的认识。 - CQM
请将Jona的答案选为正确答案,因为他第一个回答了。祝好运! - Shereef Marzouk

2

以下是我自己使用的更新解决方案。由于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()正确显示。 希望这可以帮助寻找更新解决方案的人。

0

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

我的适配器继承自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();
    }
}

0

请尝试这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接