android 基础之viewpager全解

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滚动事件中
@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
				int width = viewpager1.getWidth();
				Log.e("viewpager2","onPageScrolled"+"..."+arg0+".."+arg1+"..."+arg2+",,,,"+width);
				//滑动外部Viewpager
				viewpager1.scrollTo((int) (width * arg0 + width * arg1), 0);
			}
在外部viewpager的滚动事件中
@Override
			public 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);
			}
			

@Override
			public void onPageSelected(int arg0) {
				index = arg0;
			}

			@Override
			public 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">@Override
	public 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
	 */
	@Override
	public 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));
	}

	@Override
	public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值