VP步驟: 一、佈局
##viewpager的使用方法
注意:
1.首先在XML配置
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/viewpager" />
2.
把須要填充到ViewPager的View,先添加到ArrayList集合內(爲了讓PagerAdapter能夠獲取到須要填充的View)
思惟造成:看到setAdapter就要想到List<數據類型>
ArrayList<View>
list = new ArrayList<View>();
list.add(View.inflate(MainActivity.this, R.layout.layout1, null));
list.add(View.inflate(MainActivity.this, R.layout.layout2, null));
list.add(View.inflate(MainActivity.this, R.layout.layout3, null));
list.add(View.inflate(MainActivity.this, R.layout.layout4, null));
ViewPager的步驟
1. 實現一個PagerAdapter的子類MyPagerAdapter。
2. 實現裏面的4個方法。
3. getCount()返回當前的viewpager裏面有幾頁。
4. isViewFromObject()內部優化的邏輯
return view == object
; //這個方法固定寫法,其實能夠不暴露出來的
5. 實現instantiateItem 實例化的邏輯,
根據位置
返回view對象
(不然報異常)
//爲當前頁面添加View
viewpager.addView(list.get(position));
return list.get(position);
6. 實現destroyItem ,銷燬view對象的邏輯( 把super 刪除,不然也報異常)
//注意集合的數據是不能夠刪除的
viewpager.removeView(list.get(position));
7. 生成apk的時候 記得配置 export 輸入。
二、將要顯示的圖片,文字分別用int和String數組存起來 三、而後將佈局中的顯示的ImageView和顯示的狀態點分別存到一個ArrayList中去 四、設置viewpager的變化事件 五、在變化頁面 onPageSelected中,將對應的文本標題和狀態的點顯示正確定時切換頁面;
a)使用ScheduledExecutorService而不是Timer,
b)定時的切換,使用handler+Message更新界面
在Activity可見(onStart)時,開啓定時,不可見時(onStop)時,關閉定時 可見時,將當前的item頁面也增長1 @Override
protected void onStart() {
super.onStart();
scheduledExecutorService = Executors.newScheduledThreadPool(imageIds.length);
Runnable command = new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
// 將當前頁面增長1,而後取餘,爲了保證最後一頁能夠循環到第一頁page
currentItem = (currentItem + 1) % imageIds.length;
viewPager.setCurrentItem(currentItem);
}
});
}
};
scheduledExecutorService.scheduleWithFixedDelay(command , 2, 2, TimeUnit.SECONDS);
}
@Override
protected void onStop() {
super.onStop();
if (scheduledExecutorService != null) {
scheduledExecutorService.shutdown();
}
} |
核心代碼:
public class MainActivity extends Activity { private int imageIds[]; private String descs[]; private List<ImageView> images; private List<View> dots; private ViewPager viewPager; private PagerAdapter pagerAdapter; private TextView tv_desc;// 圖片描述 private int oldPosition = 0;// 記錄切換頁面前一個頁面的位置 private int currentItem;// 當前page的位置 private ScheduledExecutorService scheduledExecutorService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 一、圖片資源id數組 imageIds = new int[] { R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e }; // 二、圖片描述數組 descs = new String[] { "鞏俐不低俗,我就不能低俗", "撲樹又回來啦!再唱經典老歌引萬人大合唱", "揭祕北京電影如何升級", "樂視網TV版大派送", "熱血屌絲的反殺" }; // 三、要顯示的ImageView集合 images = new ArrayList<ImageView>(); for (int imageId : imageIds) { ImageView iv = new ImageView(this); iv.setImageResource(imageId); images.add(iv); } // 四、要顯示的狀態點dot集合 dots = new ArrayList<View>(); dots.add(this.findViewById(R.id.dt1)); dots.add(this.findViewById(R.id.dt2)); dots.add(this.findViewById(R.id.dt3)); dots.add(this.findViewById(R.id.dt4)); dots.add(this.findViewById(R.id.dt5)); // 初始化數據完畢---------------------- tv_desc = (TextView) this.findViewById(R.id.tv_desc); tv_desc.setText(descs[0]); viewPager = (ViewPager) this.findViewById(R.id.view_pager); pagerAdapter = new MyPagerAdapter(); viewPager.setAdapter(pagerAdapter); // viewPager.setCurrentItem(oldPosition);//設置當前顯示的item // 設置viewPager的page改變事件 viewPager.setOnPageChangeListener(new OnPageChangeListener() { // 另一張page被徹底展現的時候,調用,參數表明當前page的位置,從0開始 @Override public void onPageSelected(int position) { // System.out.println("onPageSelected:" + i); // 文字title改變 tv_desc.setText(descs[position]); // 點dot改變,前一個位置變成normal,當前變成enabled dots.get(oldPosition).setBackgroundResource(R.drawable.dot_normal); dots.get(position).setBackgroundResource(R.drawable.dot_enable); // 更新上一個位置爲當前位置 oldPosition = position; currentItem = position; } // page在拖動的過程當中,調用該方法 @Override public void onPageScrolled(int i, float f, int j) { // System.out.println("onPageScrolled:"); } // 只要狀態一變化就調用,page滾動開始和結束時會調用,狀態變化:1-2-0 @Override public void onPageScrollStateChanged(int i) { // System.out.println("onPageScrollStateChanged:" + i); } }); }
pageadapter適配器
private class MyPagerAdapter extends PagerAdapter { /** * viewpager的長度 */ @Override public int getCount() { return imageIds.length; } // 判斷是同一個view /** * 判斷滑動的控件和將要顯示的控件是否爲同一個 true 直接複用 false 會調用instantiateItem() 獲得一個新的對象 */ @Override public boolean isViewFromObject(View view, Object object) { return view == object; } /** * 移除ImageView對象 */ @Override public void destroyItem(ViewGroup container, int position, Object object) { // super.destroyItem(container, position, object);//這個要註釋掉 // View view = container.getChildAt(position); // container.removeView(view); // container.removeViewAt(position); container.removeView(images.get(position)); } /** * 獲得一個Object對象就是ImageView */ @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(images.get(position)); return images.get(position); } } @Override protected void onStart() { super.onStart(); scheduledExecutorService = Executors.newScheduledThreadPool(imageIds.length); Runnable command = new Runnable() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { // 將當前頁面增長1,而後取餘,爲了保證最後一頁能夠循環到第一頁page currentItem = (currentItem + 1) % imageIds.length; viewPager.setCurrentItem(currentItem);
}
});
}
};
scheduledExecutorService.scheduleWithFixedDelay(command , 2, 2, TimeUnit.SECONDS);
}
@Override
protected void onStop() { super.onStop(); if (scheduledExecutorService != null) { scheduledExecutorService.shutdown(); } } }
|