AppBarLayout + ViewPager + ReccyclerView +PagerSnapHelper

1,先看图AppBarLayout很高,里面有个Banner,四个大图标,还有ViewPager title,

AppBarLayout + ViewPager + ReccyclerView +PagerSnapHelper_第1张图片
AppBarLayout + ViewPager + ReccyclerView +PagerSnapHelper_第2张图片

1,首页Fragment的布局

1,最外面一个RelativeLayout 包着

2,里面第一个FrameLayout用来做搜索头,滑动时候不动

3,Framelayout下面一个SmartRefreshLayout来做全局刷新翻页,(这个要自己分配到View Pager里面的RecyclerView加载数据)

4,SmartRreshLayout里面就是常规的AppBarLayout加ViewPager

这样基本完成一大部分了。

ViewPager里面是两个Fragment,里面是RecyclerView

Fragment里面的布局是这样的

然后就可以上下滑动了。这是完美的。都是系统的架构和行为。

然后我们项目的需求有些问题,但是说了没用,需求就是RecyclerView要一滑一页。这个用PagerSnaperHelper就好了

代码三行:

recyclerView.setOnFlingListener(null);

SnapHelper snapHelper =new PagerSnapHelper();

snapHelper.attachToRecyclerView(recyclerView);

但是加了这个之后你会发现AppbarLayout 的这个行为不流畅了,app:layout_scrollFlags="scroll|exitUntilCollapsed",应该是PagerSnapHelper的动画影响了RecyclerView滑动的计算,不能一下子滑上去了。怎么办。我说实现不了。系统就这样。但是还是让我改,硬着头皮在此基础上改了一下。都自己写不可能,时间上不允许,我页没写过心里没底。首页的RelativeLayout我从写了。来监听触摸事件,在上层控制一下。

代码如下

package com.promise.view;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.RelativeLayout;import androidx.recyclerview.widget.RecyclerView;import com.google.android.material.appbar.AppBarLayout;import com.heitouyang.promise.util.Logger;public class CustomRelativeLayout extends RelativeLayout { public AppBarLayout appBarLayout; public RecyclerView recyclerView; float x1; float y1; float x2; float y2; boolean collapsed; public CustomRelativeLayout(Context context) { super(context); } public CustomRelativeLayout(Context context, AttributeSet attrs) { super(context, attrs); } public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } public void setAppBarLayout(AppBarLayout appBarLayout) { this.appBarLayout = appBarLayout; this.appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int i) { if (i == 0) { Logger.d("set collase false in onOffsetChanged"); collapsed = false;// } else if (Math.abs(i) >= appBarLayout.getTotalScrollRange()) { } else if (Math.abs(i) >= 0) { Logger.d("set collase true in onOffsetChanged"); collapsed = true; } else { } } }); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { Logger.d("on touch event"); //继承了Activity的onTouchEvent方法,直接监听点击事件 if (event.getAction() == MotionEvent.ACTION_DOWN) { //当手指按下的时候 x1 = event.getX(); y1 = event.getY(); } if (event.getAction() == MotionEvent.ACTION_MOVE) { //当手指移动的时候 x2 = event.getX(); y2 = event.getY(); if (y1 - y2 > 5) { Logger.d("collapsed:" + collapsed); if (!collapsed) { collapsed = true; Logger.d("collapsed: set true on touch"); appBarLayout.setExpanded(false, true); return true; } return false;// Toast.makeText(MyServiceTestActivity.this, "向上滑", Toast.LENGTH_SHORT).show(); } else if (y2 - y1 > 5) { if (!recyclerView.canScrollVertically(-1)) { collapsed = false; Logger.d("collapsed: set false on touch"); appBarLayout.setExpanded(true, true); }// Toast.makeText(MyServiceTestActivity.this, "向下滑", Toast.LENGTH_SHORT).show(); } else if (x1 - x2 > 50) {// Toast.makeText(MyServiceTestActivity.this, "向左滑", Toast.LENGTH_SHORT).show(); } else if (x2 - x1 > 50) {// Toast.makeText(MyServiceTestActivity.this, "向右滑", Toast.LENGTH_SHORT).show(); } } if (event.getAction() == MotionEvent.ACTION_UP) {// Log.i("Lgq","sssssssll离开了lllll=="); } return false; }}

QQ.1933772028, 欢迎交流。有时间可以干到github上。按照我上面的布局,里面的每个ViewHolder高度不用计算正好是屏幕剩下的距离。

你可能感兴趣的:(AppBarLayout + ViewPager + ReccyclerView +PagerSnapHelper)