实现起来的方法有点笨,但是效果还可以
大体思路:
一般实现这种效果都是写一个布局和你要置顶的布局格式一样,然后将之隐藏,必要的时候进行显示与隐藏
头布局
首先写recyclerView的addOnScrollListener方法,然后在onScrolled方法里面实现滑动的监听。我要实现滑动到某个控件,再往上滑就把这个控件固定在顶部。实现起来就是:
1、首先找好监听的对象,在这里我选择的是recyclerview的第一个item,如果第一个item滑动到我需要显示隐藏布局的下面那么意味着原来隐藏的那个排序的view应该显示出来了。
那么应该先找出这个item。recyclerview不像listView,会给你提供第一条可见item的位置。所以先通过recycler.getLayoutManager()方法找出recycler的manager,然后转换成LinearLayoutManager。
因为我添加了头布局,所以我的第一个item的位置可以通过View view = layoutManager.findViewByPosition(1)来找到。
2、判断第一个item的顶部坐标是否小于我需要置顶的控件的底部坐标,在这里我直接计算的搜索框+排序layout的高度,加起来是120dp,转成px。如果我的第一条数据的item顶部坐标小于这个计算出来的px值,说明我的置顶布局应该显示出来啦,否则就继续隐藏。
3、当我获取不到第一个item的时候应该怎么办呢(两种情况:1头布局占满整个屏幕,2第一个item滑出去了),所以开始会有View!=null的判断。在这里我的想法是通过findFirstCompletelyVisibleItemPosition这个方法,这是查找第一个完全可见的item的位置,如果第一个完全可见的item的位置大于第一条数据的item那么说明第一个item已经滑出去了,这个时候肯定是要将置顶的布局显示啊,其他情况对应头布局占满整个屏幕,则应该隐藏
具体的实现效果,我不是很方便录制屏幕,所以就不再上GIF图了。