我想获得我的 PagerAdapter 可见视图的当前位置。
我没有看到像 getPosition()
这样明显的函数,但我需要一个。
我想在该位置将一个对象添加到其 ArrayList 中,但我需要先知道它的位置。
我想获得我的 PagerAdapter 可见视图的当前位置。
我没有看到像 getPosition()
这样明显的函数,但我需要一个。
我想在该位置将一个对象添加到其 ArrayList 中,但我需要先知道它的位置。
您将使用:
int position = mViewPager.getCurrentItem()
我也遇到了同样的问题,无法获取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)
中传递的位置是下一个初始化的项的位置,这与显示的项无关。
如果在那一行后面写下去:
Log.i("pager",myPager.getCurrentItem()+"");
当onCreate被执行时,logcat将显示当前项目页面,而该页面始终为0。
请注意,我使用了ViewPager本身的对象,而不是适配器。
以下是我自己使用的更新解决方案。由于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()
正确显示。
希望这可以帮助寻找更新解决方案的人。我昨天刚遇到了这个问题。我需要在每个页面可见时开始播放动画,而不是之前。
我的适配器继承自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();
}
}
请尝试这个:
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) {}
})