ViewPager真正的無限輪播
阿新 • • 發佈:2019-02-19
前言:
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;
}
} });