ViewPager实现左右无限循环效果

ViewPager自身并不支持左右无限循环的功能,在网上找了很多天,发现基本都是一个原理,就是实现一种假的无限循环,取一种最大值的思路,这一种方案在上一篇中实现过,并没有真正达到左右无限循环,只是一般情况下,很难达到边界(不可滑动)的情况。下面记录一下另一种方案,网上号称是真正的无限循环。

用于显示的mViews,比数据源mList,多了两个节点元素(头节点0:b和尾节点5:e用于跳转)
下图的不带箭头的红线,是mViews根据mList初始化的情况;带箭头的红线是跳转的情况。


首先还是布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.view.ViewPager
        
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
实现数据无限循环可以通过以下步骤: 1. 在Adapter中重写getCount()方法,将其返回一个较大的值,比如Integer.MAX_VALUE,这样就可以实现数据循环的效果。 2. 在Adapter中重写getItem()方法,将其返回数据集中指定位置的数据,但是要注意,位置需要取余数,即position % data.size(),这样可以保证数据循环。 3. 在ViewPager中重写onPageSelected()方法,当用户滑动到第一个或最后一个数据时,将ViewPager设置为对应的位置,这样就可以实现无限循环效果。 以下是示例代码: ``` public class MyPagerAdapter extends PagerAdapter { private List<Data> mDataList; public MyPagerAdapter(List<Data> dataList) { mDataList = dataList; } @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) { View itemView = LayoutInflater.from(container.getContext()).inflate(R.layout.item_viewpager, container, false); TextView textView = itemView.findViewById(R.id.tv_data); Data data = mDataList.get(position % mDataList.size()); textView.setText(data.getData()); container.addView(itemView); return itemView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } public class MainActivity extends AppCompatActivity { private ViewPager mViewPager; private List<Data> mDataList = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); initViewPager(); } private void initData() { for (int i = 0; i < 10; i++) { mDataList.add(new Data("Data " + i)); } } private void initViewPager() { mViewPager = findViewById(R.id.view_pager); mViewPager.setAdapter(new MyPagerAdapter(mDataList)); mViewPager.setCurrentItem(Integer.MAX_VALUE / 2); mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if (position == 0) { mViewPager.setCurrentItem(Integer.MAX_VALUE / 2); } else if (position == Integer.MAX_VALUE - 1) { mViewPager.setCurrentItem(Integer.MAX_VALUE / 2); } } @Override public void onPageScrollStateChanged(int state) { } }); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值