1. 程式人生 > >ViewPager真正的無限輪播

ViewPager真正的無限輪播

前言:

ViewPager無限輪播功能,是指ViewPager輪播永遠無法到頭的功能.該功能是Android專案中一些比較常用的功能,我們在實現的時候,一般是通過設定ViewPager展示的個數是Integer.MAX_VALUE來搞定,有人提出這種方式不好,那我們來一起學習一種真正的輪播方式

先亮出設定簡單的實現程式碼

  • 1–在PagerAdapter中getCount方法中設定當前展示條目總個數
@Override
    public int getCount() {
        //設定為展示好多條目
        return Integer.MAX_VALUE;
    }
  • 2–在PagerAdapter中instantiateItem中展示條目資訊
@Override
    public Object instantiateItem(ViewGroup container, int position) {
        //getView 
        View view = View.inflate(context, R.layout.vp_item, null);
        ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
        TextView tv_title = (TextView) view.findViewById
(R.id.tv_title); // 0 1 2 3 4 5 6 7 // 0 1 2 3 0 1 2 3 //設定圖片資源,設定時,由於圖片索引值從0---Integer.MAX_VALUE,所以在這裡進行索引%集合.size() imageView.setImageResource(newsList.get(position%newsList.size()).getResId()); tv_title.setText(newsList.get(position%newsList.size()).getTitle()); //新增到容器中 container.addView
(view); return view; }
  • 3–在Activity中設定初始頁
//設定資料介面卡
        viewPager.setAdapter(new MyPagerAdapter(this, newsList));
        //設定當前頁碼值--一開始就在某位置
        viewPager.setCurrentItem(10000*newsList.size());

以上是使用一種方式來完成,這種方式在開發中常用,實際上可行,但是理論上是有問題,因為如果時間允許,總是可是滑動到頭的,這種方式也被一些開發所詬病,下邊來介紹另外一種方式,這種方式是對展示的集合進行操作,原理分析如下:

  • 在新增集合時,先往集合最前邊新增最後一個條目,然後正常新增集合條目,再在最後邊新增第一個條目,效果如圖

這裡寫圖片描述

  • 當進行輪播滑動時,如果滑動到第四個,再往下滑動,就會展示第一個條目資訊(當前在圖中條目1),然後這個時候,會不懂聲色的將條目當前位置切換到圖中1的位置,如此滑動,每到圖中5位置時,都會講當前位置切到圖中1的位置…

  • 對於往左滑動,如果當前在圖中1位置,再往左滑動,就會展示第四個條目資訊,同時在這個位置將當前條目索引切換到索引值4位置處….

  • 經過上邊的切換,對於四個條目的展示效果,是逢5變1,逢0變4,這樣就永遠無法滑動到頭….
下邊將程式碼貼出
  • 定義常量,指定要切換頁碼的索引值
private static final int FIRST_PAGE = 1;
  • 初始化資料,先往集合最前邊新增最後一個條目,然後正常新增集合條目,再在最後邊新增第一個條目
private void initData() {

        newsList.add(new News("我是第四個美女", R.drawable.a3)); // 0

        newsList.add(new News("我是第一個美女", R.drawable.a)); // 1
        newsList.add(new News("我是第二個美女", R.drawable.a1)); // 2
        newsList.add(new News("我是第三個美女", R.drawable.a2)); // 3
        newsList.add(new News("我是第四個美女", R.drawable.a3)); // 4

        newsList.add(new News("我是第一個美女", R.drawable.a)); // 5
    }
  • 介面卡中不做任何處理,正常寫出
public class MyPagerAdapter extends PagerAdapter {
    private Context context;
    private ArrayList<News> newsList;

    public MyPagerAdapter(Context context,ArrayList<News> newsList) {
        this.context=context;
        this.newsList=newsList;
    }

    @Override
    public int getCount() {
        return newsList.size();
    }
    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view==object;
    }
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        //getView 
        View view = View.inflate(context, R.layout.vp_item, null);
        ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
        TextView tv_title = (TextView) view.findViewById(R.id.tv_title);
        imageView.setImageResource(newsList.get(position).getResId());
        tv_title.setText(newsList.get(position).getTitle());
        //新增到容器中
        container.addView(view);
        return view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

}
  • 對viewPager設定監聽,在監聽處理邏輯
// 設定viewPager的監聽事件
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
// 滑動狀態改變的方法 state :draaging 拖拽 idle 靜止 settling 慣性過程
@Override
public void onPageScrollStateChanged(int state) {
//如果是靜止狀態,將當前頁進行替換              if(state==ViewPager.SCROLL_STATE_IDLE)
// 設定當前頁,smoothScroll 平穩滑動      viewPager.setCurrentItem(currentPosition, false);
            }
// 滑動過程中的方法 position 索引值
// positionOffset 0-1
// positionOffsetPixels 偏移畫素值
            @Override
public void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {}
// 選中某一頁的監聽
@Override
public void onPageSelected(int position) {
if (position == newsList.size() - 1) {
// 設定當前值為1
currentPosition = FIRST_PAGE;
} else if (position == 0) {
// 如果索引值為0了,就設定索引值為倒數第二個
currentPosition = newsList.size() - 2;
} else {
currentPosition = position;
}
}       });

以上是對ViewPager之真正輪播的程式碼演示