本文主要是记录ViewPager使用中第一次加载过多元素的解决方法
我在使用ViewPager时是单独使用的,没有跟诸如Fragment等连用
思路:先 隐藏要预加载的界面,延时一段时间,比如1秒,在设置预加载的界面显示
需要预加载的界面跟参数设置有关系
ViewPager.setOffscreenPageLimit(int) 这个方法的参数默认是 1 ;
这个方法的意思是设置当前显示也的左右各预先加载几个页面;
打个比方,我们设置参数为 2 ,当前显示 第 5 页 ,则 第 3,4,6,7页的元素都已加载好
如果设置为0 ,是没有效果的,源码里强制了至少是 1;
List<View> mPagers = new ArrayList<>();
// init mPages...
int mCurrentPage = 4; // 显示第四页
mViewPager = (ViewPager) findViewById(R.id.viewpager);
mViewPager.setAdapter(new ViewPagerAdapter(mPagers));
//mViewPager.setOffscreenPageLimit(2);// 0 is useless
mViewPager.addOnPageChangeListener(pageChangeListener);
mViewPager.setOverScrollMode(View.OVER_SCROLL_NEVER);
if(mCurrentPage == 0){
mPagers.get(mCurrentPage + 1).setVisibility(View.INVISIBLE);
}else if(mCurrentPage == mViewCtrl.getMenuData().dynamic.size() - 1){
mPagers.get(mCurrentPage - 1).setVisibility(View.INVISIBLE);
}else {
// 左边和右边的消失
mPagers.get(mCurrentPage - 1).setVisibility(View.INVISIBLE);
mPagers.get(mCurrentPage + 1).setVisibility(View.INVISIBLE);
}
mViewPager.setCurrentItem(mCurrentPage);
上面这段代码,mPagers里存放页面,if 判断里面,目的是把当前显示页面的左右两边 INVISIBLE
然后 mViewPager 真是显示出来时,延时一下,把隐藏的界面显示出来
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if(mCurrentPage == 0){
mPagers.get(mCurrentPage + 1).setVisibility(View.VISIBLE);
}else if(mCurrentPage == mViewCtrl.getMenuData().dynamic.size() - 1){
mPagers.get(mCurrentPage - 1).setVisibility(View.VISIBLE);
}else {
// 左边和右边的消失
mPagers.get(mCurrentPage - 1).setVisibility(View.VISIBLE);
mPagers.get(mCurrentPage + 1).setVisibility(View.VISIBLE);
}
}
}, 1000);
我这边测试效果还是可以的