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

原创 2015年11月17日 23:02:11

一:概述

前一篇博客说了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的高度。并且后面也不用减回来了。

源码下载

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

这里写图片描述

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android中的NestedScrollingParent和NestedScrollingChild分析

在分析SwipeRefreshLayout源码的时候发现该类实现了NestedScrollingParent和NestedScrollingChild两个接口,甚是好奇,于是结合了网上的资料,然后根据...
  • x87648510
  • x87648510
  • 2016年07月11日 17:43
  • 5707

NestedScrollingParent, NestedScrollingChild  详解

NestedScrollingParent NestedScrollingChild 这是两个接口,  Android 就是通过这两个接口, 来实现 子View 与父View 之间的嵌套滑动 这样...
  • chen930724
  • chen930724
  • 2015年12月15日 01:28
  • 13615

Android NestedScrolling 解析

产生原因由于在Android上进行滑动的控件在手机性能越来越好的情况下,人们已经习惯于常用的手势进行操作,出现许多控件滑动时需要去协调同一个界面的滑动的情况。例如在同一个方向内外(上下)的嵌套,不同方...
  • ysmintor
  • ysmintor
  • 2017年04月25日 17:34
  • 1581

Android NestedScrolling,NestedScrollingParent,NestedScrollingParentHelper解析

在这之前,我们知道Android对Touch事件的分发是有自己一套机制的。主要是有是三个函数: dispatchTouchEvent、onInterceptTouchEvent和onTouchEven...
  • King1425
  • King1425
  • 2017年03月13日 12:24
  • 1064

Android中的NestedScrollingParent和NestedScrollingChild的demo

  • 2016年07月11日 17:45
  • 2.73MB
  • 下载

详解:Android嵌套滑动机制 (NestedScrolling)

从 Android 5.0 Lollipop 开始提供一套 API 来支持嵌入的滑动效果。同样在最新的 Support V4 包中也提供了前向的兼容。有了嵌入滑动机制,就能实现很多很复杂的滑动效果。在...
  • u011075946
  • u011075946
  • 2015年11月06日 17:51
  • 1846

NestedScrollingParent 实现复杂交互效果

最终效果:1. 接口NestedScrollingParent 用来配置子视图( NestedScrollingChild )嵌套滚动。NestedScrollingParent 简称 NP Nes...
  • u011282069
  • u011282069
  • 2016年09月02日 10:11
  • 1060

Android NestedScrolling机制完全解析 带你玩转嵌套滑动

一、概述 Android在support.v4包中为大家提供了两个非常神奇的类: NestedScrollingParent NestedScrollingChild 如果你从未听说过这两个...
  • lmj623565791
  • lmj623565791
  • 2016年08月15日 08:36
  • 64837

NestedScrollView 嵌套 ListView 实现滑动折叠效果

NestedScrollView 嵌套 ListView 替代 RecyclerView实现折叠效果
  • nothingl3
  • nothingl3
  • 2016年01月30日 16:53
  • 4904

NestedScrollView 嵌套 RecyclerView

  • 2016年01月07日 15:16
  • 8.56MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对scrollview嵌套listview说不(二)NestedScrollingParent +RecyleView
举报原因:
原因补充:

(最多只允许输入30个字)