ViewPager的setAdapter和setCurrentItem的方法解析
来源:互联网 发布:中国独立电影 知乎 编辑:程序博客网 时间:2024/06/08 04:44
public void setAdapter(PagerAdapter adapter) { if (mAdapter != null) {//先判断mAdapter是否为空,如果不为空,销毁之前的view,将当前的item设置为0,并滚动到0,0位置。 mAdapter.unregisterDataSetObserver(mObserver); mAdapter.startUpdate(this); for (int i = 0; i < mItems.size(); i++) { final ItemInfo ii = mItems.get(i); mAdapter.destroyItem(this, ii.position, ii.object); } mAdapter.finishUpdate(this); mItems.clear(); removeNonDecorViews(); mCurItem = 0; scrollTo(0, 0); }}...............if (mRestoredCurItem >= 0) {//从onRestoreInstanceState方法里取得需要回复的item的下标,如果>=0,恢复对应实例。 mAdapter.restoreState(mRestoredAdapterState, mRestoredClassLoader); setCurrentItemInternal(mRestoredCurItem, false, true);//设置当前选中为mRestoredCurItem的位置 mRestoredCurItem = -1; mRestoredAdapterState = null; mRestoredClassLoader = null; } else if (!wasFirstLayout) { //如果不是第一次加载,调用populate方法。 populate(); } else {//如果不是第一次加载,将mFirstLayout设置为true,调用requestLayout方法,会重新调用onMeasure、onLayout方法。 requestLayout(); }
在onLayout方法中,调用scrollToItem(int item, boolean smoothScroll, int velocity,boolean dispatchSelected)方法,滚动内容滚动到第一个位置。
private boolean pageScrolled(int xpos) {}方法会调用onPageScrolled(currentPage, pageOffset, offsetPixels)方法,在onPageScrolled方法里又调用了dispatchOnPageScrolled方法,在这个方法中会判断是否是否设置了OnPageChangeListener的回调接口,如果设置了,只会调用mOnPageChangeListener的onPageScrolled方法,并不会调用onPageSelected方法。
设置当前选中的页面public void setCurrentItem(int item) { mPopulatePending = false; setCurrentItemInternal(item, !mFirstLayout, false); } 此时,mFirstLayout的值为false。这个值用来判断是否需要平滑的滚动。
在这个方法中会处理页面的滑动。void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) { if (mAdapter == null || mAdapter.getCount() <= 0) { setScrollingCacheEnabled(false); return; } if (!always && mCurItem == item && mItems.size() != 0) { setScrollingCacheEnabled(false); return; //这里always的值为false,重新调用setAdapter以后,mCurItem 的值为0, 调用setScrollingCacheEnabled就直接返回了。如果条件不成立,会根据dispatchSelected的值判断是否要调用dispatchOnPageSelected方法,(这里dispatchOnPageSelected会一直为true),继而调用mOnPageChangeListener的onPageSelected方法。 } }
重新设置adapter,又调用setCurrentItem(0),此时,mCurItem 和设置的item的值是一样的,
所以并不会调用onPageSelected方法。
0 0
- ViewPager的setAdapter和setCurrentItem的方法解析
- ViewPager调用SetCurrentItem()方法,跨页面跳转时闪屏的问题
- 修改ViewPager调用setCurrentItem时,滑屏的速度
- 批改ViewPager调用setCurrentItem时,滑屏的速度
- 修改ViewPager调用setCurrentItem时,滑屏的速度
- 怎么设置viewpager在使用setCurrentItem的滑动速度
- 怎么设置viewpager在使用setCurrentItem的滑动速度
- 设置viewpager在使用setCurrentItem的滑动速度
- ViewPager的setCurrentItem数值过大导致ANR异常
- Android学习笔记——关于Android ViewPager 在 adapter.notifyDataSetChanged 后 setCurrentItem 方法失效的解决办法
- ViewPager 的adapter 设置notifyDataSetChanged(),后 ViewPager.setCurrentItem()无效。(页面不滚动)
- 关于listview的setAdapter和notifyDataSetChanged
- 关于listview的setAdapter和notifyDataSetChanged
- android中listview的setAdapter()和getAdapter()
- android 只修改ViewPager调用setCurrentItem时,滑屏的速度,其他正常
- viewpager的setCurrentItem 底部导航栏点击按钮实现直接跳转,去掉滑动效果
- 修改ViewPager调用setCurrentItem时,滑屏的速度 ,解决滑动之间切换动画难看
- Android之 修改ViewPager调用setCurrentItem时,滑屏的速度
- Post/Get差别
- dxComponentPrinter操作打印预览 dxComponentPrinter1Link1.Preview(True); 页眉和页脚 [图片] dxComponentPrinter1Li
- MS CRM 2016 certificate备考摘要(1) - 2016 SP1的新功能from MSDN
- X11硬线接口信号 与Profisafe安全输入输出信号之间的区别与比较
- Activity数据的缓存
- ViewPager的setAdapter和setCurrentItem的方法解析
- Java微信开发二(通过java程序自定义公众号菜单)
- Samba服务器配置
- python实现时间的比较
- js函数前问号的作用 封装的mui的ajax请求函数
- dbgrideh、dxdbgrid和cxgrid保留上次的列宽、列序
- React Native运行原理解析
- 迅雷下载地址转换(Python3)
- maven打包web项目时同时打包为war和jar文件