android - ViewPager OnAdapterChangeListener 设置第一页
问题描述
我正在尝试构建一个ViewPager
不需要从外部进行任何设置的循环。为了让这个 ViewPager 进行循环滚动,我需要将最后一个图像的副本放在开头(索引 0),并将第一个图像的副本放在末尾。这意味着我ViewPager
必须从索引 1 开始,而不是索引 0。我可以通过调用轻松地从外部执行此操作viewPager.setCurrentItem(1)
,但我想将其封装在PagerAdapter
自身中。
我的问题是找到一个合适的回调方法来做到这一点。它在PagerAdapter
.
一种似乎可行的方法是OnAdapterChangeListener
在下面的代码中添加一个like。这是合法的还是我会遇到麻烦?
public class CircularViewPagerAdapter extends PagerAdapter {
private Context context;
private List<String> imageUrls;
private int lastIndex;
private int position = 1;
CircularViewPagerAdapter(Context context, final ViewPager viewPager, List<String> imageUrls) {
this.context = context;
this.imageUrls = imageUrls;
if (imageUrls.size() > 1) {
imageUrls.add(0, imageUrls.get(imageUrls.size() - 1));
imageUrls.add(imageUrls.get(1));
lastIndex = imageUrls.size() - 1;
}
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
CircularViewPagerAdapter.this.position = position;
}
@Override
public void onPageScrollStateChanged(int state) {
if (position == 0) viewPager.setCurrentItem(lastIndex - 1, false);
if (position == lastIndex) viewPager.setCurrentItem(1, false);
}
});
viewPager.addOnAdapterChangeListener(new ViewPager.OnAdapterChangeListener() {
@Override
public void onAdapterChanged(@NonNull ViewPager viewPager, @Nullable PagerAdapter oldAdapter, @Nullable PagerAdapter newAdapter) {
viewPager.setCurrentItem(1);
}
});
}
@Override
public int getCount() {
return imageUrls.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
@NonNull
@Override
public Object instantiateItem(@NonNull final ViewGroup container, int position) {
ImageView imageView = new ImageView(context);
Picasso.get()
.load(imageUrls.get(position))
.fit()
.centerCrop()
.into(imageView);
container.addView(imageView);
return imageView;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView((View) object);
}
}
解决方案
为了实现 Circle View Pager,我在这里找到了解决方案。您只需使用SOURCE HERE中的以下类来自定义 View 寻呼机
InfinitePagerAdapter.java,
InfiniteViewPager.java,
RecycleBin.java,
RecyclingPagerAdapter.java
在那之后使用InfinitePagerAdapter
瞬间PagerAdapter
。
推荐阅读
- dataset - 每周收到的项目 KPI
- function - 如何将方法绑定到 Kotlin 中的名称?
- oracle - 在物化视图创建中考虑同一张表的子查询
- javascript - 仅使用 Babel/Webpack 进行转译/polyfilling
- amazon-web-services - AWS Cloudwatch 警报简化警报以配置到整个粘合作业集群
- sql - 如何在另一列之前找到最新日期的行?
- android-studio - 无法识别的 Android Studio 版本
- css - css动画向左移动,重新出现在右侧并继续向左
- amazon-ec2 - WSO2 API 管理器 - TypeError 无法在 API 中获取尝试
- csv - 将 CSV 加载到 Apache Beam 时如何处理换行符?