ViewPager的简介和作用
ViewPager的适配器ViewPager实现小圆点指示器效果
ViewPager禁止滑动和取消滑动效果
ViewPager滑动到最后一条再次滑动的监听
1.ViewPager的简介和作用
ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view2.ViewPager的适配器
实现一个最基本的PagerAdapterpublic class AdapterViewpager extends PagerAdapter { private ListmViewList; public AdapterViewpager(List mViewList) { this.mViewList = mViewList; } @Override public int getCount() {//必须实现 return mViewList.size(); } @Override public boolean isViewFromObject(View view, Object object) {//必须实现 return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) {//必须实现,实例化 container.addView(mViewList.get(position)); return mViewList.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) {//必须实现,销毁 container.removeView(mViewList.get(position)); } }
实现一个最基本的FragmentPagerAdapter
public class AdapterFragment extends FragmentPagerAdapter { private ListmFragments; public AdapterFragment(FragmentManager fm, List mFragments) { super(fm); this.mFragments = mFragments; } @Override public Fragment getItem(int position) {//必须实现 return mFragments.get(position); } @Override public int getCount() {//必须实现 return mFragments.size(); } @Override public CharSequence getPageTitle(int position) {//选择性实现 return mFragments.get(position).getClass().getSimpleName(); } }
FragmentStatePagerAdapter的实现和FragmentPagerAdapter区别在于前者适用于页面更多的界面,从源码中我们可以看出FragmentStatePagerAdapter中fragment实例在destroyItem的时候被真正释放,所以FragmentStatePagerAdapter省内存。FragmentPagerAdapter中的fragment实例在destroyItem的时候并没有真正释放fragment对象只是detach,所以FragmentPagerAdapter消耗更多的内存,带来的好处就是效率更高一些。所以得出这样的结论:FragmentPagerAdapter适用于页面比较少的情况
3实现小圆点指示器方法
mLlDot = (LinearLayout) view.findViewById(R.id.ll_dot);//指示器容器根据pagercount数量动态添加圆点和监听
mLlDot.removeAllViews();//防止重复添加异常 for (int i = 0; i < pageCount; i++) { mLlDot.addView(inflater.inflate(R.layout.dot, null));//指示器的样式我们可以自己随便定义 }
// 默认显示第一页 mLlDot.getChildAt(0).findViewById(R.id.v_dot) .setBackgroundResource(R.drawable.dot_selected); mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { public void onPageSelected(int position) { // 取消圆点选中 mLlDot.getChildAt(curIndex) .findViewById(R.id.v_dot) .setBackgroundResource(R.drawable.dot_normal); // 圆点选中 mLlDot.getChildAt(position) .findViewById(R.id.v_dot) .setBackgroundResource(R.drawable.dot_selected); curIndex = position;//取消上一个,选中下一个坐标点 } public void onPageScrolled(int arg0, float arg1, int arg2) { } }); }
4viewpager禁止滑动,点击按钮滑动取消滑动效果
当我们我们需要通过底部导航按钮切换viewpager并取消滑动动画时可以自定义viewpager重写public class LyViewPager extends ViewPager{ private boolean scroll = false; public LyViewPager(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public LyViewPager(Context context) { super(context); } public boolean isScroll() { return scroll; } public void setScroll(boolean scroll) {//通过开关控制是否可以滑动 this.scroll = scroll; } @Override public void scrollTo(int x, int y) { super.scrollTo(x, y); } @Override public boolean onTouchEvent(MotionEvent arg0) { //如果滑动不做处理不滑动返回false,不消费给父控件去处理 if (scroll) return super.onTouchEvent(arg0); else { return false; } } @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { if (scroll) return super.onInterceptTouchEvent(arg0); else { return false; } } @Override public void setCurrentItem(int item, boolean smoothScroll) { super.setCurrentItem(item, smoothScroll); } @Override public void setCurrentItem(int item) { super.setCurrentItem(item); } }
点击viewpager没有切换效果的方法
pager.setCurrentItem(pos, false);//第二个参数设置为false
5viewpager当为最后一条滑动时触发监听
有时我们需要滑动到最后一条时(比如广告页),用户再次滑动直接跳转我们想要的页面可以这样做
实现的方法非常多,下面的这种方式是最简单和简洁的
增加pager监听方法,我们在第三个方法中监听page的滑动状态
mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { public void onPageSelected(int position) { curIndex = position;//取消上一个,选中下一个坐标点 } public void onPageScrolled(int arg0, float arg1, int arg2) { } public void onPageScrollStateChanged(int state) { switch (state) { case ViewPager.SCROLL_STATE_DRAGGING://拖曳状态 isScrolled = false; break; case ViewPager.SCROLL_STATE_SETTLING://拖曳后自动归为状态 isScrolled = true; break; case ViewPager.SCROLL_STATE_IDLE:////被用户滑动后的最终静止状态 并且是最后一页非滑动情况直接走相关的监听跳转 if (mPager.getCurrentItem() == mPager.getAdapter().getCount() - 1 && !isScrolled) { mGoToDianbaoListener.go(mPager.getAdapter().getCount() - 1);//这里使用了接口回调,可以根据自己的需求监听 } isScrolled = true; break; } } });