返回

两个方法搞定ViewPager + Fragment无限滑动

Android

ViewPager + Fragment是一种常见的Android开发技术,它可以实现页面滑动切换的效果。而无限滑动是ViewPager的一个常见需求,本文将介绍两种实现ViewPager+Fragment无限滑动的方法,并分析其优缺点。

方法一:使用PagerAdapter

第一种方法是使用PagerAdapter。PagerAdapter是ViewPager的一个适配器,它负责管理ViewPager中的页面。要实现无限滑动,我们需要创建一个继承PagerAdapter的类,并重写其中的几个方法。

public class InfinitePagerAdapter extends PagerAdapter {

    private List<Fragment> fragments;

    public InfinitePagerAdapter(List<Fragment> fragments) {
        this.fragments = fragments;
    }

    @Override
    public int getCount() {
        return Integer.MAX_VALUE;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        int index = position % fragments.size();
        Fragment fragment = fragments.get(index);
        FragmentManager fragmentManager = ((FragmentActivity) container.getContext()).getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(container.getId(), fragment);
        fragmentTransaction.commit();
        return fragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        Fragment fragment = (Fragment) object;
        FragmentManager fragmentManager = ((FragmentActivity) container.getContext()).getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.remove(fragment);
        fragmentTransaction.commit();
    }
}

在使用PagerAdapter时,我们需要在ViewPager的setAdapter()方法中传入一个InfinitePagerAdapter对象。这样就可以实现无限滑动。

方法二:使用setCurrentItem()方法

第二种方法是使用setCurrentItem()方法。setCurrentItem()方法可以设置ViewPager当前显示的页面。要实现无限滑动,我们需要在ViewPager的addOnPageChangeListener()方法中监听页面的滑动事件。当页面滑到最后一个时,我们需要将ViewPager的当前页面设置为第一个。

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
        if (position == viewPager.getAdapter().getCount() - 1) {
            viewPager.setCurrentItem(0);
        }
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});

在使用setCurrentItem()方法时,我们需要在ViewPager的setAdapter()方法中传入一个普通的PagerAdapter对象。然后在addOnPageChangeListener()方法中监听页面的滑动事件,当页面滑到最后一个时,将ViewPager的当前页面设置为第一个。

两种方法的优缺点对比

这两种方法各有优缺点。第一种方法滑动更流畅,不过试过需要至少4个元素才能使用。否则要么报错要么就会有白屏。第二种方法的缺点是第一个和最后一个元素切换效果可能不是太好。

为了可以向左也能无限滑动,设置初始位置可以在中间,也可以是一个大一点的数字,一般不需要去处理滑到到0时的状况。

无论使用哪种方法,都可以实现ViewPager + Fragment的无限滑动。大家可以根据自己的需求选择适合自己的方法。

结语

以上就是两种实现ViewPager + Fragment无限滑动的方法。希望对大家有所帮助。