0. 效果圖
1. 填充數據,ViewPager實現
用一個javabean來封裝數據,
// 加載適配器
vpContainer.setAdapter(new MyAdapter());
2. 動態添加標題
onPageChangeListener()來監聽ViewPager的事件來改變標題
/**
* 監聽ViewPager的滑動,來動態改變標題
*
* @author admin
*
*/
class MyPagerChangeListener implements OnPageChangeListener {
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int arg0) {
initTitleAndDot();
}
private void initTitleAndDot() {
int currentPosition = vpContainer.getCurrentItem() % ads.size();
tvTitle.setText(ads.get(currentPosition).getTitle());
// 設置當前獲取焦點的dot
for (int i = 0; i < llDotContainer.getChildCount(); i++) {
llDotContainer.getChildAt(i).setSelected(currentPosition == i);
}
}
}
3. 添加指示點
根據廣告的數量來往指示點容器裏添加dot
// 根據廣告的數量來動態添加dot
for (int i = 0; i < ads.size(); i++) {
View child = new View(this);
// TODO LayoutParams的使用
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(8,
8);
if (i != 0) {
params.leftMargin = 5;
}
child.setBackgroundResource(R.drawable.selector_dot);
child.setLayoutParams(params);
llDotContainer.addView(child);
}
dot的狀態用selector來控制
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_selected="true" android:drawable="@drawable/shape_dot_focus"></item>
<item android:state_selected="false" android:drawable="@drawable/shape_dot_unfocus"></item>
</selector>
4. 自動切換
利用handler來實現
// 實現廣告自動切換
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
vpContainer.setCurrentItem(vpContainer.getCurrentItem() + 1);
// 類似迭代實現自動切換功能
mHandler.sendEmptyMessageDelayed(0, 3000);
};
};
// 自動切換,利用handler實現
// 每個3秒切換一次
mHandler.sendEmptyMessageDelayed(0, 3000);
5. 無限循環
根據PagerAdpater的getCount()方法,
將返回的view的數量設置爲Integer.MAX_VALUE
這樣來實現僞無限循環。
/**
* ViewPager的適配器
*
* @author admin
*
*/
class MyAdapter extends PagerAdapter {
@Override
public int getCount() {
// return ads.size();
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg1 == arg0;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView ivImage = new ImageView(MainActivity.this);
ivImage.setImageResource(ads.get(position % ads.size()).getImage());
ivImage.setScaleType(ScaleType.FIT_XY);
container.addView(ivImage);
return ivImage;
}
}
int count = Integer.MAX_VALUE / 2 % ads.size();// 當前頁與第一頁的差值
vpContainer.setCurrentItem(Integer.MAX_VALUE / 2 - count);// 將廣告設置爲中間,這樣才能能兩邊無限循環