ViewPager相信大家都很熟悉,4.x前都需要导入android-support-v4.jar,4.x后sdk已提供支持; 应用场景也很常见,一般应用于程序的引导页;应用也很简单,一个Adapter就可以搞定,代码如下:
public class MyViewPagerAdapter extends PagerAdapter{
private List<View> mListViews;
public MyViewPagerAdapter(List<View> mListViews) {
this.mListViews = mListViews;//构造方法,参数是我们的页卡,这样比较方便。
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mListViews.get(position));//删除页卡
}
@Override
public Object instantiateItem(ViewGroup container, int position) { //这个方法用来实例化页卡
container.addView(mListViews.get(position), 0);//添加页卡
return mListViews.get(position);
}
@Override
public int getCount() {
return mListViews.size();//返回页卡的数量
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;//官方提示这样写
}
}
但这不是我们今天要讲的主题,我们今天说的是关键词是:动态加载、循环滑屏….
应用场景不再局限与程序引导,而在数据交互之间体现;下面请看实现效果图:
下面我们来看看如何去做,先上Activity代码,代码是主项目中抠下来的:
viewPager = (ViewPager) findViewById(R.id.viewPager);
listViews = new ArrayList<View>();
//初始化ViewPager
bookShelfView = new BookshelfCompositeView(this);//
bookCityView = new OxygenBookCityView(this);//
readFriendsView = new ReadFriendsCircleView(this);//
listViews.add(bookShelfView);//
listViews.add(bookCityView);//
listViews.add(readFriendsView);//
mPagerAdapter = new MyPagerAdapter(listViews, this);
mPagerAdapter.setLoadTag(false);
viewPager.setAdapter(mPagerAdapter);
viewPager.setCurrentItem(COUNT);
viewPager.setOnPageChangeListener(listener);
/**
* 创建View
*/
public void createView(int currentItem) {
if (currentItem == BOOKSHELF_ITEM) {
// 书架
if (bookShelfView instanceof IPanelView) {
((IPanelView) bookShelfView).onCreate();
}
} else if (currentItem == BOOKCITY_ITEM) {
// 书城
if (bookCityView instanceof IPanelView) {
((IPanelView) bookCityView).onCreate();
}
} else if (currentItem == READFRIENDS_ITEM) {
// 读友圈
if (readFriendsView instanceof IPanelView) {
((IPanelView) readFriendsView).onCreate();
}
}
}
OnPageChangeListener listener = new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
LogUtil.e("当前页面索引:" + arg0);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
};
Activity主要对ViewPager做了初始化的操作,主要是Adapter代码实现:
public class MyPagerAdapter extends PagerAdapter {
public List<View> listViews = null;
public HashMap<View, Boolean> loadTag;
public MainNewActivity mContext;
public int mIndex;//滑动索引
public MyPagerAdapter(List<View> listViews, MainNewActivity mContext) {
this.listViews = listViews;
this.mContext = mContext;
loadTag = new HashMap<View, Boolean>();
}
/**
* 设置加载标志
*
* @param tag
*/
public void setLoadTag(boolean tag) {
if (listViews != null && listViews.size() > 0) {
int size = listViews.size();
for (View views : listViews) {
loadTag.put(views, tag);
}
}
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void destroyItem(View container, int position, Object object) {
// LogUtil.e("TipsPagerAdapter", "destroyItem is called " + position);
// ((ViewPager) container).removeView(listViews.get(position %
// listViews.size()));
}
@Override
public CharSequence getPageTitle(int position) {
return super.getPageTitle(position);
}
@Override
public Object instantiateItem(View container, int position) {
LogUtil.e("TipsPagerAdapter", "instantiateItem is called " + position);
try {
((ViewPager) container).addView(
listViews.get(position % listViews.size()), 0);
} catch (Exception e) {
}
// ((ViewPager) container).addView(listViews.get(position);
// return listViews.get(position);
LogUtil.e("instantiateItem>>>>>>" + position % listViews.size());
return listViews.get(position % listViews.size());
}
/**
* 进行View预加载处理
*/
@Override
public void setPrimaryItem(View container, int position, Object object) {
// TODO Auto-generated method stub
super.setPrimaryItem(container, position, object);
LogUtil.e("setPrimaryItem>>>>>>" + position % listViews.size());
mIndex = position % listViews.size();
if (loadTag.get(listViews.get(mIndex)) == false) {
mContext.createView(mIndex);
loadTag.put(listViews.get(mIndex), true);
}
}
}
这里有必要解释和注意一下:
循环滑动是通过初始化一个较大的CurrentItem(页数)在getview中通过position % listViews.size()实现,看上去实现了循环滑动,实则假循环,但当用户向左滑动CurrentItem次后就无法滑动,所以建议将CurrentItem值越大越好,试想一下哪个用户那么无聊不停去滑动直到突破你的滑动值呢。
动态加载在setPrimaryItem中实现,每次滑动都会调用setPrimaryItem,所以在这里可以进行网络加载,这里我loadTag判断是否需要重复加载。
讲到这里就今天的内容就告一段落。由于这个实现是项目中的一部分,所以源码今天就不放了,等有时间我将整理成一个demo放上来。