首页 > 解决方案 > 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);
}
}

标签: androidandroid-viewpagerandroid-pageradapter

解决方案


为了实现 Circle View Pager,我在这里找到了解决方案。您只需使用SOURCE HERE中的以下类来自定义 View 寻呼机

InfinitePagerAdapter.java,  
InfiniteViewPager.java,  
RecycleBin.java,   
RecyclingPagerAdapter.java 

在那之后使用InfinitePagerAdapter瞬间PagerAdapter


推荐阅读