• ViewPager 无限循环


    Overview

    我们在使用ViewPager来制作图片轮播的时候,常常为ViewPager不能一直无限循环的问题所苦恼。对于这个问题,目前从网上找到了两个思路来解决:

    • 将 ViewPager 的Count 的数量设置的尽可能的大,然后就造成了无限循环的假象。

    • 第二种,方式是,假如三个图片无限循环,那么就需要用5张图片,如下图所示

    使用这种方式启动的时候,需要将 2 号图片,设置为第一张,当向前滑动的时候,因为前面的 1号图片 是和 4 号图片一样,那么,给人的错觉就像是无线循环的一样,当选中一号图片后,立即将当前选中的图片设置为 4 号图片,4号图片向5号图片滑动也是同理。

    实现

    关于第一种方式,我想对大家来说都不是问题,本文主要是介绍第二种方式的实现方式

    Step 1: 准备好任意3张图片

    Step 2: 建立Adapter,为了一劳永逸,我们需要做一些简单的封装,来方便我们以后的使用

    通用的Adapter

    package com.example.it.recycleviewpager;
    
    import android.content.Context;
    import android.support.v4.view.PagerAdapter;
    import android.view.View;
    import android.view.ViewGroup;
    
    import java.util.List;
    
    /**
     * Created by 鲁迅认识的那只猹 on 9/25/2017 10:58 AM.
     * Emial 1258730808@qq.com
     * Desc:
     */
    
    public abstract class BaseRecycleViewPagerAdapter<T> extends PagerAdapter {
        private Context context;
        private List<T> dataSource;
    
        public BaseRecycleViewPagerAdapter(Context context, List<T> dataSource) {
            this.context = context;
            this.dataSource = dataSource;
    
            //为了无线循环添加两个冗余项目
            T t1 = dataSource.get(0);
            T t2 = dataSource.get(dataSource.size() - 1);
            this.dataSource.add(dataSource.size() , t1);
            this.dataSource.add(0, t2);
        }
    
        /**
         * 返回视图的数量
         */
        @Override
        public int getCount() {
            return dataSource.size();
        }
    
        /**
         * 实例化,Page
         */
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View view = bindingView(position);
            container.addView(view);
            return view;
        }
    
        /***
         * 抽象方法,绑定视图,需要子类实现
         */
        abstract View bindingView(int position);
    
        /**
         * 回收资源
         */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
    
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }
    
        public Context getContext() {
            return context;
        }
    
        public List<T> getDataSource() {
            return dataSource;
        }
    }
    
    

    建立Adapter,从BaseRecycleViewPagerAdapter 继承

    public class AdvertisingAdapter extends BaseRecycleViewPagerAdapter<Integer> {
    
        public AdvertisingAdapter(Context context, List<Integer> dataSource) {
            super(context, dataSource);
        }
    
        /**
         * 建立我们需要用来轮播的图片
         */
        @Override
        View bindingView(int postion) {
            ImageView imageView = new ImageView(getContext());
            imageView.setLayoutParams(new ViewGroup.LayoutParams(-1, -1));
            imageView.setImageResource(getDataSource().get(postion));
            return imageView;
        }
    }
    
    

    Step3: 测试我们的Adapter

    public class MainActivity extends AppCompatActivity {
    
        private ViewPager viewPager;
        private AdvertisingAdapter advertisingAdapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            viewPager = (ViewPager) this.findViewById(R.id.vp);
            init();
        }
    
        void init() {
            List<Integer> resIdList = new ArrayList<>();
            resIdList.add(R.drawable.pet2);
            resIdList.add(R.drawable.pet3);
            resIdList.add(R.drawable.pet4);
            advertisingAdapter = new AdvertisingAdapter(this, resIdList);
            viewPager.setAdapter(advertisingAdapter);
            //设置第二张图片为最初显示的图片
            viewPager.setCurrentItem(1);
            //设置Item的选中事件,实现循环
            viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    if (position == 0)
                        viewPager.setCurrentItem(viewPager.getAdapter().getCount() - 2, false);
                    if (position == viewPager.getAdapter().getCount() - 1)
                        viewPager.setCurrentItem(1, false);
                }
            });
        }
    }
    
    

    源码下载

    基本的需求已经实现,如果还有更多的需求,还可以根据上面的扩展。

    我的码云: https://gitee.com/ShareKnowledge/RecycleViewPager

  • 相关阅读:
    数据结构>图的应用(拓扑排序,关键路径) 小强斋
    数据结构>图的最短路径 小强斋
    数据结构>图的连通性和最小生成树 小强斋
    mysql查看表的存储引擎等相关信息
    java.util.TaskQueue的最小堆排序算法的应用
    jetty源码阅读总结1
    lucene3.6.0的高亮显示
    log4j MDC NDC应用场景
    velocity自定义标签和指令
    jetty关于http状态码处理的一个很有用的类
  • 原文地址:https://www.cnblogs.com/slyfox/p/7591121.html
Copyright © 2020-2023  润新知