一.問題
ViewPager可以左右滑動(dòng)頁, 但是不能從首頁跳到最后頁,也不能從最后頁跳到首頁愿待。
這就限制左右循環(huán)滑動(dòng)的功能, 難以實(shí)現(xiàn)輪播效果展鸡!
二.解決方法
方法一
監(jiān)聽ViewPager滑動(dòng)狀態(tài) OnPageChangeListener
1.當(dāng)首頁向右滑時(shí), ViewPager.setCurrentItem 設(shè)為最后頁;
2.當(dāng)最后頁向左滑時(shí), ViewPager.setCurrentItem 設(shè)為首頁阔蛉!
缺陷:很明顯首頁和最后頁過渡效果差衩婚,動(dòng)畫效果不好控制殴边,麻煩靖榕!
方法二
1.把ViewPager總頁數(shù)設(shè)為整數(shù)最大值,欺騙ViewPager(PagerAdapter),使得用戶不可能滑到邊界;
2.把ViewPager初始位置設(shè)為整數(shù)最大值的一半附近;
3.與ViewPager有關(guān)的position都要和真實(shí)總頁數(shù)取余數(shù),轉(zhuǎn)換為真實(shí)頁數(shù)欧聘!
方法二明顯比方法一過渡效果自然, 用戶不可能滑動(dòng)到整數(shù)最大值根吁!
雖然把總頁數(shù)設(shè)為整數(shù)最大值, 但是ViewPager創(chuàng)建總對(duì)象數(shù)并沒有增多, 性能消耗不變员淫!
此方法雖然是旁門左道,但是可行有效便捷击敌!
public class MainActivity extends Activity {
int mPageSize; // 真實(shí)總頁數(shù)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(new MyPagerAdapter());
// 把初始位置設(shè)為總頁數(shù)一半(總頁數(shù)為虛構(gòu)最大值,用于欺騙ViewPager)
// 減去余數(shù),使初始位置為真實(shí)首頁數(shù)
int hMax = Integer.MAX_VALUE/2;
viewPager.setCurrentItem(hMax - (hMax%mPageSize)) ;
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
position = position%mPageSize; // 求余,恢復(fù)真實(shí)頁數(shù)
......
}
@Override
public void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {
position = position%mPageSize; // 求余,恢復(fù)真實(shí)頁數(shù)
......
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
private class MyPagerAdapter extends PagerAdapter {
@Override
public int getCount() {
// 把總頁數(shù)設(shè)為int最大值,欺騙ViewPager(PagerAdapter)
// mPageSize才是真實(shí)總頁數(shù)
return Integer.MAX_VALUE;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
position = position%mPageSize; // 求余,恢復(fù)真實(shí)頁數(shù)
......
}
@Override
public boolean isViewFromObject(View view, Object object) {
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
position = position%mPageSize; // 求余,恢復(fù)真實(shí)頁數(shù)
......
}
}
}
簡(jiǎn)書:
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/72633317
GitHub博客:http://lioil.win/2017/05/22/Android_ViewPager_Slide.html
Coding博客:http://c.lioil.win/2017/05/22/Android_ViewPager_Slide.html