这次开发涉及到5个内容:EventBus使用场景,RecyclerView滑动监听,系统定位权限的申请以及定位处理,网络配置,ViewPager2的使用所以,我会在这里进行前四个部分进行问题解决的方案,第五个会单独写个文章进行全面的剖解
1 EventBus使用场景:因为有个需求,需要点击tabview之后,viewpager的fragment中的列表就会回到第一条数据,所以当时就想直接用EventBus去使用,但是其实,可以直接在fragment中暴露一个方法(backTop())出来,在tabview的页面进行pager监听方法中的onSelected进行调用
override fun onSelected(index: Int, totalCount: Int){
mfragment.backTop()
}
然后EventBus的应用场景虽然也可以这样用的,但是建议使用在一个页面的信息改变,但是需要通知到其他页面作出改变的场景
2 RecyclerView滑动监听
设置滑动监听:
mRecyclerView.setOnScrollListener(object: RecyclerView.OnScrollListener() {
override public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
override public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
})
onScrollStateChanged(RecyclerView recyclerView, int newState)这个方法在RecyclerView的滑动状态改,newState=0时,RecyclerView在停止状态中
newState=1和newState=2时,RecyclerView在滑动状态中
不同的是,当由0—>1 ,2 时,RecyclerView由静止状态下变为滑动状态,然后1–0 滑动状态变为静止(调用方法 mHomeDateRecyclerView.smoothScrollToPosition(currentPostion); 等这一类方法所触发) , 2–>0 滑动状态变为静止状态(左右滑动RecyclerView 动态的慢慢结束)
onScrolled(RecyclerView recyclerView, int dx, int dy ) 这个方法在RecyclerView开始滑动时实时回调
参数dx dy分别是RecyclerView在滑动过程中,在x轴方向(横向滑动)与Y轴方向(纵向滑动)的偏移量
dx>0 向右滑动
dx<0 向左滑动
dy<0 向上滑动
dy>0 向下滑动
RecyclerView这部分是参考“早起的年轻人”这位大佬的,里面还有滑动距离监听的方法等,详情请查看下面的地址
参考地址:
https://blog.csdn.net/zl18603543572/article/details/77876030
然后,RecyclerView有时候有业务需求判断是否到了底部,请看下“天热死了”这位大佬的文章,文章地址:
https://blog.csdn.net/zhouwengong/article/details/81738261
还有如何滚动到指定位置,请参考下面的文章:
https://juejin.cn/post/6844904143560114189
滚动速度的设置请参考下面的地址:
https://juejin.cn/post/6844903624632434695
https://juejin.cn/post/6844903624632434696
3 关于定位权限以及定位处理,了解下定位的几种方法:
https://blog.csdn.net/ccpat/article/details/106380620
具体使用:
https://www.jianshu.com/p/e97d55262bd4
4关于viewPager切换fragment时,fragment的生命周期变化,请看这位大佬的,详细描述,都写得很清楚:
https://blog.csdn.net/Meikos/article/details/52076907?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control
关于这个就总结下,因为这位大佬写得很长,viewPager中,初始化的时候,会预先加载下一个页面fragment,举例:共有四个页面fragment,在初次进入的时候会加载1和2的页面(当前页面为1,1和2都进入onResume),然后切换到2页面,1和2页面生命周期没有任何变化,3页面进行加载(进入到onResume),然后切换3页面,1页面进入销毁,4页面进入到onResume
那么viewpager在后台和前台切换的时候生命周期的变化是怎么样的呢?
举例:当前页面是3页面,从前台切换到后台,2,3,4页面都会进入到onStopo的生命周期,而从后台切换到前台,2,3,4页面就会进入到onResume,那么整体在当前activity,finsh掉之后才会全部销毁
同时需要注意下fragment使用的adapter继承的是有本质的区别的,建议使用FragmentStatePagerAdapter进行继承,为何?请看下面的这个文章:
https://blog.csdn.net/a527891474/article/details/54099649
如果遇到fragment页面数据加载页面,这个问题的解决方式极其简单,就是创建viewpager的adapter时不要继承FragmentPagerAdapter,要继承FragmentStatePagerAdapter,一定要记住!!
原因也很简单,就是因为我们不需要自己去创建和销毁viewpager中的adapter,这两个类中已经帮我们完成了(所以用着会非常非常简单)。
那么最坑爹的来了,在FragmentPagerAdapter中创建完fragment就不会销毁了,所以会导致再次进入就不会重新创建,当然更不会加载网络数据了。相反FragmentStatePagerAdapter就不会。
emmmm,总结结束,就是为了让我自己以后遇到相同的问题知道怎么解决,感谢各位大佬的好文章!!真棒
网友评论