简体   繁体   English

ViewPager OnAdapterChangeListener设置第一页

[英]ViewPager OnAdapterChangeListener to set the first page

I am trying to build a circular ViewPager where I don't have to make any settings from the outside. 我正在尝试构建圆形的ViewPager ,而无需从外部进行任何设置。 In order for this ViewPager to have circular scrolling, I need to put a copy of the last image at the start (index 0) and a copy of the first image at the end. 为了使此ViewPager可以循环滚动,我需要将最后一个图像的副本放在开头(索引0),将最后一个图像的副本放在结尾。 This mean that my ViewPager has to start at index 1, not index 0. I can easily do this from the outside by calling viewPager.setCurrentItem(1) , but I want to encapsulate this in the PagerAdapter itself. 这意味着我的ViewPager必须从索引1开始,而不是索引0。我可以通过调用viewPager.setCurrentItem(1)从外部轻松地做到这一点,但是我想将其封装在PagerAdapter本身中。

My problem is finding an appropriate callback method to do that. 我的问题是找到一个合适的回调方法来做到这一点。 It doesn't work in the constructor of the PagerAdapter . 它在PagerAdapter的构造函数中PagerAdapter

One way that seems to work is by adding an OnAdapterChangeListener like in my code below. 似乎可行的一种方法是像下面的代码中那样添加一个OnAdapterChangeListener Is that legit or will I run into trouble? 那是合法的,还是我会遇到麻烦?

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);
}
}

For achieving the Circle View Pager i have found the solution here. 为了实现Circle View Pager,我在这里找到了解决方案。 you just have to customize the View pager by using the below classes from SOURCE HERE 您只需要使用SOURCE HERE中的以下类来自定义View寻呼机

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

After that use InfinitePagerAdapter instant of PagerAdapter . 之后,使用PagerAdapter InfinitePagerAdapter即时。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM