Я пытаюсь построить круговую ViewPager
, где мне не нужно ничего делать снаружи.Чтобы этот ViewPager имел круговую прокрутку, мне нужно поместить копию последнего изображения в начале (индекс 0) и копию первого изображения в конце.Это означает, что мой ViewPager
должен начинаться с индекса 1, а не с индекса 0. Я легко могу сделать это извне, вызвав viewPager.setCurrentItem(1)
, но я хочу инкапсулировать это в самом PagerAdapter
.
Моя проблема заключается в поиске подходящего метода обратного вызова для этого.Это не работает в конструкторе PagerAdapter
.
. Один из способов, который, кажется, работает, это добавить OnAdapterChangeListener
, как в моем коде ниже.Это законно или у меня будут проблемы?
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);
}
}