SwipeRefreshLayout+CoordinatorLayout+AppBarLayout+TabLayout+ViewPager+RecyclerView 刷新,不能滑动等问题

使用SwipeRefreshLayout+CoordinatorLayout+AppBarLayout+TabLayout+ViewPager+Fragment+RecyclerView 实现首页悬浮效果遇到一些问题,做个记录:

首先我的布局结构大概是这样子的:

<轮播图/> <首页按钮入口/>  

 

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包含应该就可以了。

 

 

你可能感兴趣的:(安卓开发)