android 基础之viewpager全解

来源:互联网 发布:free pascal c语言 编辑:程序博客网 时间:2024/06/07 06:00

1、viewpager基本以及viewpager与pagerIndicator  http://blog.csdn.net/xiaanming/article/details/10766053


2、viewpager切换动画

       推荐jazzyviewpager这个开源框架,github上面可以去看看,另外这个链接上面也有,不过应该是从github上down下来的效果,可以参考下http://gqdy365.iteye.com/blog/2114968


3、viewpager联动(多个viewpager嵌套联动控制)

      参考文章 http://blog.csdn.net/u010032372/article/details/48223521

      关键点:一个viewpager滚动时控制另一个viewpager也实时滚动,需要在onPagerChangeListener方法里面来控制

     内部viewpager滚动事件中
@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {int width = viewpager1.getWidth();Log.e("viewpager2","onPageScrolled"+"..."+arg0+".."+arg1+"..."+arg2+",,,,"+width);//滑动外部Viewpagerviewpager1.scrollTo((int) (width * arg0 + width * arg1), 0);}
在外部viewpager的滚动事件中
@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {//arg0当前滑动界面//arg1当页面前滑动百分比//arg2当前页面滑动像素//Log.v("onPageScrolled", "arg0"+arg0+"arg1"+arg1+"arg2-"+arg2);int width=viewpager2.getWidth();//滑动内部Viewpager viewpager2.scrollTo((int)(width*arg0+width*arg1), 0);}

@Overridepublic void onPageSelected(int arg0) {index = arg0;}@Overridepublic void onPageScrollStateChanged(int arg0) {if (arg0 == 0) {viewpager1.setCurrentItem(index);}}


4、垂直viewpager

      参考文章http://blog.csdn.net/t12x3456/article/details/9397389

     主要用到开源框架 https://github.com/JakeWharton/Android-DirectionalViewPager 大家可以去github上面看看

     参考文章有demo,大家可以下载下来看看,需要注意的问题是,向上拖动时,背景也是跟着向上移动小段距离的,

<span style="font-size:18px;"><a target=_blank href="http://blog.csdn.net/t12x3456/article/details/9397389">@Overridepublic void onPageScrollStateChanged(int state) {Log.i("way", "onPageScrollStateChanged...  state = " + state+ ",  mCurrentItem = " + mCurrentItem);if (state == ViewPager.SCROLL_STATE_IDLE) {mBg.setY(-mCurrentItem * mSize);}}/** * * @param position 第几页 * @param positionOffset 从第一页到第二页时,由0-1 * @param positionOffsetPixels */@Overridepublic void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {Log.i("way", "onPageScrolled...  position=" + position+ ", positionOffset=" + positionOffset+ ", positionOffsetPixels=" + positionOffsetPixels);if (positionOffset == 0.0f)return;mBg.setY(-((position + positionOffset) * mSize));}@Overridepublic void onPageSelected(int position) {Log.i("way", "onPageSelected....  position=" + position);mCurrentItem = position;}</a></span>


5、viewpager自动切换与无限循环

      参考文章 http://blog.csdn.net/Just_Sanpark/article/details/17436037

      实现起来都不难,本人更倾向于第二种,毕竟第二种更简单点


6、viewpager禁止滑动与viewpager懒加载

  

@Override     public boolean onTouchEvent(MotionEvent ev) {             return isScrollable && super.onTouchEvent(ev);     }@Override     public boolean onInterceptTouchEvent(MotionEvent ev) {     return isScrollable && super.onInterceptTouchEvent(ev);     }


7、viewpager适配器 FragmentPagerAdapter 和 FragmentStatePagerAdapter 和PagerAdapter区别

      FragmentPagerAdapter适用于Fragment小于等于3个的情况,FragmentStatePagerAdapter适用于Fragment比较多 的情况

     http://blog.csdn.net/crazymo_/article/details/51858313(讲的很清楚)

8、viewpager动态加载,动态增删item

      关于使用中发现,在删除或者修改数据的时候,PagerAdapter无法像BaseAdapter那样仅通过notifyDataSetChanged方法通知刷新View。

       通常情况下调用notifyDataSetChanged方法会让ViewPager通过Adapter的getItemPosition方法查询一遍所有child view,如果所有child view位置均为POSITION_NONE,表示所有的child view都不存在,ViewPager会调用destroyItem方法销毁,并且重新生成,从而加大系统开销,并在一些复杂情况下导致逻辑问题。特别是对于只是希望更新child view内容的时候,但造成了完全不必要的开销,

  • 列表内容如果是针对于child view比较简单的情况(例如仅有TextView、ImageView等,没有ListView等展示数据的情况),可以重写PagerAdapter的方法getItemPosition

    

@Override    public int getItemPosition(Object object) {        return  POSITION_NONE;    }


  • 但复杂的情况则需要根据自己的需求来实现notifyDataSetChanged的功能,比如,在仅需要对某个View内容进行更新时,在instantiateItem()时,用View.setTag方法加入标志,在需要更新信息时,通过findViewWithTag的方法找到对应的View进行局部更新。


0 0
原创粉丝点击