【发布时间】:2012-01-22 04:59:46
【问题描述】:
我想获取我的 PagerAdapter 可见视图的当前位置
我没有看到像 getPosition() 这样的明显功能,我想要一个。
我想在那个位置将一个对象添加到它的数组列表中,但我需要先知道它
【问题讨论】:
标签: android arraylist pager android-viewpager
我想获取我的 PagerAdapter 可见视图的当前位置
我没有看到像 getPosition() 这样的明显功能,我想要一个。
我想在那个位置将一个对象添加到它的数组列表中,但我需要先知道它
【问题讨论】:
标签: android arraylist pager android-viewpager
你会使用:
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 中执行此操作对我不起作用,因为我想预加载不可见的图像。 PageAdapter`的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() 正确显示。
希望这对寻找更新解决方案的人有所帮助。
【讨论】:
试试这个:
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) {}
})
【讨论】:
我昨天刚遇到这个问题。当页面对用户可见而不是之前,我需要在每个页面中开始播放动画。
我的适配器继承自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();
}
}
【讨论】: