对scrollview嵌套listview说不(二)NestedScrollingParent +RecyleView

来源:互联网 发布:网络上sm啥意思是什么 编辑:程序博客网 时间:2024/05/03 10:26

一:概述

前一篇博客说了listview中的adapter中装多个adapter的方式解决scrollview嵌套listview的方式,这篇就说nestscrolling+recycleview的方式解决问题。
效果图:

这里写图片描述

二:预备知识

首先我们先了解下NestedScrollingChild 和 NestedScrollingParent

子布局中需要实现NestedScrollingChild接口 并且需要有个NestedScrollingChildHelper 成员变量,实现接口后需要实现一些方法,方法中调用NestedScrollingChildHelper 对应的方法即可。

比如:

    @Override    public void stopNestedScroll() {        childHelper.stopNestedScroll();    }

其他方法类似即可。

需要重点说一下onTouchEvent()方法。

switch (event.getAction()) {case MotionEvent.ACTION_DOWN:     //开始滑动:startNestedScroll(ViewCompat.SCROLL_AXIS_HORIZONTAL|ViewCompat.SCROLL_AXIS_VERTICAL);     break;case MotionEvent.ACTION_MOVE://将事件分发给父布局中if (dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow)) {      dx -= consumed[0];      dy -= consumed[1];}case MotionEvent.ACTION_UP:     //停止滑动     stopNestedScroll();     break;}

在action_down,action_up中调用开始,停止滑动的方法。

dx -= consumed[0]; consumed[0]是父布局中消耗的x方向上的位移。
dy -= consumed[1]; consumed[1]是父布局中消耗的y方向上的位移。

然后dx,dy就可以自己使用了。

父布局中需要实现NestedScrollingParent 接口 实现这个接口的类中需要NestedScrollingParentHelper 成员变量并且需要实现一些方法。

    public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {        return true;    }    @Override    public void onNestedScrollAccepted(View child, View target, int axes) {        parentHelper.onNestedScrollAccepted(child, target, axes);    }    @Override    public void onStopNestedScroll(View child) {        parentHelper.onStopNestedScroll(child);    }

onStartNestedScroll 返回true ,NestedScrollingChild 和 NestedScrollingParent 的关系才能有意义。

//子布局中分发过来的事件就可以在这里面进行处理。将自己消耗掉的位移加给consumed[0],consumed[1]就可以了。    @Override    public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) {    }

好了通过上面的讲解,基本可以使用NestedScrollingChild 和 NestedScrollParent了。

 public class RecyclerView extends ViewGroup implements ScrollingView, NestedScrollingChild{ }

因为RecyclerView 已经实现了NestedScrollingChild,我们就只用管ParentView了。

这里写图片描述

如图,上面是一个headerview,下面就是recycleview,这二者组合成了一个parentview

<?xml version="1.0" encoding="utf-8"?>    <com.example.tongmin.nestscrollingandrecyleview.ParentView        xmlns:android="http://schemas.android.com/apk/res/android"        android:layout_width="match_parent"        android:layout_height="match_parent">        <android.support.v7.widget.RecyclerView            android:id="@+id/list"            android:background="#8C9BEB"            android:layout_width="match_parent"            android:layout_height="match_parent"/>    </com.example.tongmin.nestscrollingandrecyleview.ParentView>

当我们在向上滑动的过程中,判断headerView是否已经完全消失不见了,如果没有,那么就让parentview整体向上滑动。
注意: 因为parentview整体向上滑动那么recycleview肯定随着parentview一起向上滑动,但是parentview的高度是match_parent,向上滑动后下面就会“走光”了。

如图:
这里写图片描述

所以这里需要处理的是,在向上滑动的时候需要动态的将parentview的高度增高一次。

   ViewGroup.LayoutParams params = this.getLayoutParams();   params.height = headerHeight+this.getHeight();   this.setLayoutParams(params);   requestLayout();

而这个增加的高度就是headerview的高度。并且后面也不用减回来了。

源码下载

加个好友共同学习(不是公众号):

这里写图片描述

因为小弟水平有限,如果有写的有问题,希望指出。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2岁幼儿头发稀少怎么办 小孩头发太少了怎么办 头发少盘丸子头怎么办 油头发掉的厉害怎么办 头顶头发长得慢怎么办 每次洗头发都掉很多头发怎么办 拔了头发不长怎么办 6岁儿童头发稀少怎么办 2岁宝宝胆子小怎么办 坐到小孩的头怎么办 托班幼儿不刷牙怎么办 两岁的宝宝蛀牙怎么办 小孩在学校被打怎么办 油画棒画在墙上怎么办 宝宝把蜡笔吃了怎么办 吃鸡更新了怎么办开始 数字画涂料干了怎么办 广告画颜料干了怎么办 宝宝断奶后瘦了怎么办 腿一个粗一个细怎么办 两条小腿不一样粗怎么办 两岁宝宝坐不了怎么办 q糖孩子吃多了怎么办 q糖孩子吃的太多怎么办 ps图层不能覆盖怎么办 孩子的字写的不好怎么办 孩子爱打人怎么办 6招 一岁宝宝爱打人怎么办 2岁小朋友爱打人怎么办 小朋友爱动手怎么办4岁 5,6岁爱动手打人怎么办 七个月宝宝大便干燥怎么办 两岁宝宝吐奶怎么办 2岁宝宝轻微蛀牙怎么办 2岁宝宝喝水都吐怎么办 2岁宝宝吐的厉害怎么办 两岁宝宝个子矮怎么办 宝宝吐了一天了怎么办 3岁宝宝吃饭呕吐怎么办 3岁宝宝突然呕吐怎么办 11个月婴儿呕吐怎么办