【第22期】观点:IT 行业加班,到底有没有价值?

对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的高度。并且后面也不用减回来了。

源码下载

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

这里写图片描述

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

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

相关文章推荐

解决NestedScrollView 嵌套 RecyclerView出现的滑动冲突问题

NestedScrollView嵌套RecyclerView的xml代码:

NestedScrollingParent, NestedScrollingChild  详解

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

Android中NestedScrollingParent嵌套ListView

使用CoordinatorLayout,AppBarLayout,RecyclerView很容易就能完成。由于当前开发的工程由于一些原因不能使用AndroidDesignSupport包。只能自己解决...

Android NestedScrolling 解析

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

Android中的NestedScrollingParent和NestedScrollingChild分析

在分析SwipeRefreshLayout源码的时候发现该类实现了NestedScrollingParent和NestedScrollingChild两个接口,甚是好奇,于是结合了网上的资料,然后根据...

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

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

android嵌套滑动NestedScrolling

首先来看我门要做的效果: 布局是用一个linerLayout实现NestedScrollingParent 接口,然后里面一次放了一个head,tablayout,viewpager,recyc...

R语言数据挖掘资料

R语言数据挖掘资料 一、分类 1)决策树分类 http://blog.sina.com.cn/s/blog_6fb7db430100veen.html,包含理...

笔记+R︱Logistics建模简述(logit值、sigmoid函数)

本笔记源于CDA-DSC课程,由常国珍老师主讲。该训练营第一期为风控主题,培训内容十分紧凑,非常好,推荐:CDA数据科学家训练营 一、logit值的来源 逻辑回归一般将因变量二分类变量的0-1转...

GridView+NestedScrollView 滑动冲突问题的两种解决方法

原来的项目用GridView来展示图库图片,要求新增滑动隐藏ToolBar功能。 代码如下     xmlns:android="http://schemas.android.com/apk/res/...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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