SnapHelper
Google在support.design包24.2.0版本时添加了SnapHelper类,这个类用于结合RecyclerView使用,实现滑动之后确定RecyclerView Item的对齐方式:比如说居中、左对齐、顶部对齐等效果。SnapHelper是一个抽象类。Google官方有两个实现类
- LinearSnapHelper:用来让Item居中显示。
- PagerSnapHelper:则是在LinearSnapHelper的基础上限制一次只能滑动一个Item。更多效果请参考
https://github.com/rubensousa/RecyclerViewSnap
SnapHelper详细请参考:http://www.jianshu.com/p/ef3a3b8d0a77
今天使用SnapHelper实现了一个电影列表的DEMO:效果图如下(GIF有点卡):
GIF.gif还可以用来实现选择器:
QQ截图20170625234402.jpg
像上面的效果
相对的,ViewPager也可以实现差不多的效果,只不过RecyclerView + LinearSnapHelper 可以快速滑动,而且有着 RecyclerView 的特性。
如何选择,得根据项目的实际情况了。个人认为两种方式的优缺点如下:
- ViewPager:单页滑动,可以使用setPageTransformer很轻松的实现滑动时切换的动画效果,而实现View的回收和复用则相对复杂。
- RecyclerView:可以快速滑动也可以单页滑动,可是如果要实现页面切换效果则有点复杂,需要自定义LayoutManager,参考 https://github.com/Azoft/CarouselLayoutManager 而View的回收复用则无需使用者过多关心。
以上。
RecyclerView 判断滑动到底部的3种方法:
- 首先获取RecyclerView的LayoutManager,通过判断最后一个可见的item的position是不是等于item总数-1。如果相等则可以判断滑动到底部。可以是有一种极端情况就是当totalItemCount等于1,而这个子项的高度比屏幕还要高时候,就会判断错误。当然这种情况几乎不会出现。
public static boolean isVisBottom(RecyclerView recyclerView){
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
//屏幕中最后一个可见子项的position
int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
//当前屏幕所看到的子项个数
int visibleItemCount = layoutManager.getChildCount();
//当前RecyclerView的所有子项个数
int totalItemCount = layoutManager.getItemCount();
//RecyclerView的滑动状态
int state = recyclerView.getScrollState();
if(visibleItemCount > 0 && lastVisibleItemPosition == totalItemCount - 1 && state == recyclerView.SCROLL_STATE_IDLE){
return true;
}else {
return false;
}
}
- 通过Recyclerview的computeVerticalScrollExtent()返回当前屏幕显示的区域高度,computeVerticalScrollOffset()返回之前已经滑动过的高度,computeVerticalScrollRange()返回整个控件的高度。当前显示高度 + 已经滑动过的高度 >= 整个空间高度的时候就是滑动到底部了。
public static boolean isSlideToBottom(RecyclerView recyclerView) {
if (recyclerView == null) return false;
if (recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset()
>= recyclerView.computeVerticalScrollRange())
return true;
return false;
}
- 使用RecyclerView.canScrollVertically(1)来判断,返回false表示已经到底:这个方法的实现是根据第二点的参数来判断的。所以第二个方法和第三个方法是没什么区别的。
RecyclerView.canScrollVertically(1)的值表示是否能向上滚动,false表示已经滚动到底部
RecyclerView.canScrollVertically(-1)的值表示是否能向下滚动,false表示已经滚动到顶部
RecyclerView是一个很强大的类。以后我会在Adapter与LayoutManager的方向上深入去学习这个控件。
网友评论