谷歌新出的Android Design Support Library带来了新的兼容的md风格控件,其中的coordinatorlayout配合appbarlayout再指定behavior可以实现滚动的效果,然而很遗憾,在应用到项目的时候,出现各种问题,比如:
1.我所在的coordinatorlayout布局里需要用到viewstub作为网络请求异常时懒加载的布局,在coordinatorlayout如果延时20多ms再去viewstub.inflate的话布局就找不到了,在relativelayout这些布局就是可以随时调用加载显示。
2.首先向上滚动recycleview,直到tablayout跟随滚动被隐藏,切换到其他fragment再切换回coordinatorlayout所在的fragment,向下滚动recycleview回到位置0的话,tablayout不会滚回来了,需要稍微先上滑动一下再向下话才能回来,估计是tablayout设置的属性app:layout_scrollFlags=”scroll|enterAlways”问题。
3.向上滚动recycleview到一定位置,点击回到顶部的按钮,调用scrollToPosition(0)回到位置0的话,tablayout也是不会滚回来的,也是需要稍微先上滑动一下再向下话才能回来。
所以思考调试了很久还是决定自己动手,丰衣足食,不要coordinatorlayout,再tablayout的包裹布局,通过监听recycleview的onscroll事件,取每次偏移量,调用tablayout的包裹布局的scrollby(0,dy)来实现移动,并针对快速滑动时偏移量的突增进行了判断和处理,最终实现了较好的tablayout随recycleview滚动而滚动效果,这样用户滑动recycleview时能够看到更多的内容,体验又提升了。
首先看下mainactivity的布局:
viewpager和tablayout放在帧布局里面,这样做是为了,recycleview位置0的地方添加一个跟tablayout等高的view,从而tablayout不会遮住recycleview的图片item
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:fitsSystemWindows="true"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/material_primary"
app:popupTheme="@style/Theme.AppCompat.Light">
</android.support.v7.widget.Toolbar>
<FrameLayout
android:layout_below="@id/toolbar"
android:layout_width="match_parent"
android:layout_height