无限循化Banner, ViewPager的两种实现方法

无限循环ViewPager效果图(设置了PageTransFormer,实现了画廊效果的):

方法一:

在源数据列表头和尾分别补上两个元素, 比如我们源数据列表顺序是[1,2,3], 真正使用到ViewPager中的列表变成[2,3,1,2,3,1,2]

源代码如下:

首先是xml文件, 为了实现"画廊"效果, ViewPager不能match_parent, 且在ViewPager父布局要设置 clipChildren="false"

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorWhite"
    android:clipChildren="false"
    tools:context="com.test.demoone.banner.BannerActivity">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_centerHorizontal="true"
        android:background="@color/colorSeparate"
        android:clipChildren="false" />

    <View
        android:id="@+id/viewPagerHelper"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_centerHorizontal="true"
        android:clickable="true"
        android:focusable="true"
        android:visibility="gone" />

    <Button
        android:id="@+id/buttonChangeData"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/viewPager"
        android:onClick="changeData"
        android:text="change data" />

    <Button
        android:id="@+id/buttonTurnNext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/buttonChangeData"
        android:onClick="turnNext"
        android:text="turn next" />

</RelativeLayout>

接下来是Activity中的代码:

public class BannerActivity extends AppCompatActivity {

    private BannerAdapter adapter;
    private ViewPager viewPager;
    private List<String> dataList;
    private ZoomOutTransformer zoomOutTransformer;
    private boolean needToChangePosition = false;
    private View viewPagerHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_banner);


        dataList = new ArrayList<>();
        for (int i = 0; i < 1; i++) {
            dataList.add("原 " + i);
        }

        viewPagerHelper = findViewById(R.id.viewPagerHelper);
        viewPager = findViewById(R.id.viewPager);
        ViewPagerScroller scroller = new ViewPagerScroller(this);
        // 时间越长,速度越慢。
        scroller.setScrollDuration(600);
        scroller.initViewPagerScroll(viewPager);

        adapter = new BannerAdapter(this, dataList);
        zoomOutTransformer = new ZoomOutTransformer();
        viewPager.setPageTransformer(true, zoomOutTransformer);
        viewPager.setOffscreenPageLimit(2);
        viewPager.setAdapter(adapter);
        viewPager.setCurrentItem(adapt
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现ViewPager中Fragment的无限循环,可以采用以下几个步骤: 1.在ViewPager的Adapter中重写getCount()方法,将其返回一个较大的值,例如Integer.MAX_VALUE,这样就可以让ViewPager中的Fragment无限循环。 2.在ViewPager的Adapter中重写getItem()方法,将其返回的position取模操作,以确保获取到正确的Fragment。 3.在ViewPager的Adapter中重写getPageTitle()方法,将其返回的title也进行取模操作,以确保获取到正确的title。 下面是一个示例代码: ```java public class MyPagerAdapter extends FragmentPagerAdapter { private static final int NUM_PAGES = 3; private List<Fragment> fragmentList; private List<String> titleList; public MyPagerAdapter(FragmentManager fm) { super(fm); fragmentList = new ArrayList<>(); titleList = new ArrayList<>(); for (int i = 0; i < NUM_PAGES; i++) { fragmentList.add(new MyFragment()); titleList.add("Page " + (i + 1)); } } @Override public Fragment getItem(int position) { return fragmentList.get(position % NUM_PAGES); } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public CharSequence getPageTitle(int position) { return titleList.get(position % NUM_PAGES); } } ``` 在上面的示例代码中,我们将ViewPager中的Fragment数量设置为3,然后在getCount()方法中返回一个较大的值Integer.MAX_VALUE,这样就可以让ViewPager中的Fragment无限循环。在getItem()和getPageTitle()方法中,我们对position取模操作,以确保获取到正确的Fragment和title。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值