使用SwipeRefreshLayout+CoordinatorLayout+AppBarLayout+TabLayout+ViewPager+Fragment+RecyclerView 实现首页悬浮效果遇到一些问题,做个记录:
首先我的布局结构大概是这样子的:
<SwipeRefreshLayout>
<CoordinatorLayout>
<AppBarLayout> <轮播图/> <首页按钮入口/> <TabLayout/> </AppBarLayout>
<ViewPager/>
</CoordinatorLayout>
</SwipeRefreshLayout>
ViewPager里面当然是Fragment了,Fragment里面是使用RecyclerView(使用的是一个可以加载更多的RecyclerView)
不过这不是重点;
第一个问题:刷新问题冲突,解决是监听AppBarLayout滑动开启关闭SwipeRefreshLayout是否可刷新,
实现以下:
AppBarLayout.OnOffsetChangedListener接口就可以了,这里goTopLayout是我返回顶部按钮显示判断,不用可以忽略;
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if (verticalOffset >= 0) {
mSwipRefreshLayout.setEnabled(true);
} else {
mSwipRefreshLayout.setEnabled(false);
}
if (Math.abs(verticalOffset) >= appBarLayout.getTotalScrollRange()) {
goTopLayout.setVisibility(View.VISIBLE);
}else{
goTopLayout.setVisibility(View.GONE);
}
}
第二个问题:滑动到一定距离如何返回顶部:逻辑是先让RecyclerView返回顶部 然后调用AppBarLayout折叠就可以完成返回顶部操作,代码实现如下:
AppBarLayout展开折叠设置:appBarLayout.setExpanded(true,true);
RecyclerView 返回顶部直接mRecyclerView.scrollToPosition(0);
第三个问题:发现折叠+切换Fragment偶尔出现AppBarLayout卡住,无法滑动问题,只有ViewPager的RecyclerView部分可以滑动,后面解决如下:
初始化完成后调用一下代码就可以解决问题
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
@Override
public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
return true;
}
});
第四个问题:在RecyclerView属性中加入android:nestedScrollingEnabled="false" 导致高系统版本无法联动,触发事件单一处理AppBarLayout或者RecyclerView,也就是手指滑动RecyclerView就只滑动RecyclerView部分,需要滑动AppBarLayout要手动滑动AppBarLayout部分内容才可以,这个问题是因为对上面属性不了了解导致,本想解决有点卡顿问题,最后加入这一属性查了很久才找到问题。
第五个问题:强行加入第五个问题,就是RecyclerView数据为空时加入EmptyVIew无法滑动问题,EmptyView使用
NestedScrollView包含应该就可以了。