博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ViewPager的那些事
阅读量:5930 次
发布时间:2019-06-19

本文共 2594 字,大约阅读时间需要 8 分钟。

目录:

1、禁止点击tag时ViewPager滚动的过渡动画。

2、解决adapter的notifyDataSetChanged()无效问题。
3、设置ViewPager的预加载页数。
4、禁止ViewPager手势左右切换的操作。
5、ViewPager左右滑动的惯性消失的bug。
6、ViewPager与子View进行通信。


1、禁止点击tag时ViewPager滚动的过渡动画:

当我们的ViewPager绑定了TabLayout控件的时候,通常都有点击一个tab实现切换ViewPager的功能,但是如果在切换时不想要那个切换动画,该如何做? **解决方案:**其实很简单,关键代码就一句:

//第二个参数就是禁止滚动过渡的效果mViewPager.setCurrentItem(0, false);复制代码

2、解决adapter的notifyDataSetChanged()无效问题:

如果想实现ViewPager的数据更新,在调用adapter的notifyDateSetChanged()会发现并没有效果,其实并非没有效果,往后滑动两页到第三页会发现,除了ViewPager默认缓存的那三页数据没有刷新之外,后面的(第三页之后)数据都是刷新了的,这时再返回第一页会发现第一页的数据也发生变化了。 **解决方案:**复写adapter的getItemPosition方法,返回POSITION_NONE即可。

public int getItemPosition(Object object) {      return POSITION_NONE;}复制代码

存在的问题:这不是PagerAdapter中的Bug,通常情况下,调用notifyDataSetChanged方法会让ViewPager通过Adapter的getItemPosition方法查询一遍所有child view,这种情况下,所有child view位置均为POSITION_NONE,表示所有的child view都不存在,ViewPager会调用destroyItem方法销毁,并且重新生成,加大系统开销,并在一些复杂情况下导致逻辑问题。特别是对于只是希望更新child view内容的时候,造成了完全不必要的开销。更有效地方法:更为靠谱的方法是因地制宜,根据自己的需求来实现notifyDataSetChanged的功能,比如,在仅需要对某个View内容进行更新时,在instantiateItem()时,用View.setTag方法加入标志,在需要更新信息时,通过findViewWithTag的方法找到对应的View进行更新即可。


3、设置ViewPager的预加载页数:

ViewPager默认会预加载左右两页的内容,如果想预加载更多,只需调用ViewPager的setOffscreenPageLimit()即可。

mViewPager.setOffscreenPageLimit(2); // 设置缓存view 的个数(实际有3个,缓存2个+正在显示的1个)复制代码

4、禁止ViewPager手势左右切换的操作:

**解决方案:**自定义View继承自ViewPager,代码如下:

public class ViewPagerEx extends ViewPager{    private boolean isPagingEnabled = true;    public ViewPagerEx(Context context) {        super(context);    }    public ViewPagerEx(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        return this.isPagingEnabled && super.onTouchEvent(event);    }    @Override    public boolean onInterceptTouchEvent(MotionEvent event) {        return this.isPagingEnabled && super.onInterceptTouchEvent(event);    }    public void setPagingEnabled(boolean canScroll) {        this.isPagingEnabled = canScroll;    }    @Override    public void setCurrentItem(int item, boolean smoothScroll) {        super.setCurrentItem(item, smoothScroll);    }}复制代码

使用方法:

mViewPager.setPagingEnabled(false);//禁止左右滑动mViewPager.setPagingEnabled(true);//开启左右滑动复制代码

5、ViewPager左右滑动的惯性消失的bug。

检查下FragmentPagerAdapter的构造方法是不是传了getFragmentManager()?如果是,改为getChildFragmentManager()即可,没错,就是这么简单。


6、ViewPager与子View进行通信。

比如我想在ViewPager每滑动结束后,通知子View并进行刷新。

//利用Tag去获取到对应的子View,然后对View进行操作。 viewPager.findViewWithTag(position);//在Adapter的instantiateItem方法中给子View设置Tagview.setTag(position);复制代码

(不定期更新)

转载于:https://juejin.im/post/5a3a2469f265da4334700f2a

你可能感兴趣的文章
深入浅出JavaScript (二) 代码放置位置与执行顺序
查看>>
Git -- 删除文件
查看>>
PowerShell_3_零基础自学课程_3_如何利用Powershell ISE调试PS脚本
查看>>
Windows下SQLMAP的安装图解
查看>>
Linux使用ssh公钥实现免批量分发管理服务器
查看>>
SpringMvc入门一----介绍
查看>>
算法详解之拓扑排序
查看>>
Fragment的用法(类似于.net的用户控件,重用性好)。。。。---------------android
查看>>
vue小组件练习之文字居中对齐组件
查看>>
ASP.NET中对SQLITE数据库进行插入操作后返回自增的ID
查看>>
编译器常见的CRT理解和延伸
查看>>
ios3和ios4退出时的区别
查看>>
BugSense in iOS
查看>>
软件工程与项目管理
查看>>
从零开始理解JAVA事件处理机制(1)
查看>>
redis基础学习---1
查看>>
ASP.NET Core 一步步搭建个人网站(1)_环境搭建
查看>>
雅虎面试题─有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除...
查看>>
微软等公司数据结构+算法面试100题---字符串
查看>>
matlab的基本操作(1)
查看>>