对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 NestedScrolling机制完全解析 带你玩转嵌套滑动

一、概述 Android在support.v4包中为大家提供了两个非常神奇的类: NestedScrollingParent NestedScrollingChild 如果你从未听说过这两个...

NestedScrollingParent, NestedScrollingChild  详解

NestedScrollingParent NestedScrollingChild 这是两个接口,  Android 就是通过这两个接口, 来实现 子View 与父View 之间的嵌套滑动 这样...

Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()

Android中触摸事件传递过程中最重要的是dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()方法。这个是困扰初学者的问题之一,我开...

RecyclerView的NestedScrollingParent

这篇博文继续带来RecyclerView的用法,查看过RecyclerView的源码可以看到,RecyclerView继承了 NestedScollingChild接口。这个接口配合NestedScr...

打造高逼格个人中心动效UI

目录 目录 简介 图片avi 自定义Behavior的基础知识 例子的实现 DEMO相关声明:转载请注明本文地址简介前段时间由于产品的”神奇”(qi pa)需求,需要能下拉刷新放大,上划折叠,而且下半...

NestedScrollView的使用

在上一篇文章中,我们了解了CoordinatorLayout的使用,它可以让ToolBar随RecycleView的滑动滑入和划出屏幕,但是在一些其它场景下,我们不一定会用到RecycleView,假...

NestedScrollView 之 ScrollView 嵌套 ListView

【问题汇总】ScrollView嵌套ListView的问题 Anroid  Studio 新建一个工程之后,默认继承AppCompatActivity, MainActivity 布局如下  ...

群硕面试问题集锦(92个真题)

群硕面试问题集锦(92个真题)

Android中的NestedScrollingParent和NestedScrollingChild分析

在分析SwipeRefreshLayout源码的时候发现该类实现了NestedScrollingParent和NestedScrollingChild两个接口,甚是好奇,于是结合了网上的资料,然后根据...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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