对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开发自定义ListView解决在NestedScrollView里不能用listview的问题(ScrollView嵌套ListView的问题)

前几天想玩一玩AppBarLayout,没想到遇到在NestedScrollView里不能用listview的问题,即结果无论如何都只能显示一行数据,终于解决了。 想一想,其实这也是在ScrollVi...

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

NestedScrollView 嵌套 ListView 替代 RecyclerView实现折叠效果

NestedScrollView的使用

在上一篇文章中,我们了解了CoordinatorLayout的使用,它可以让ToolBar随RecycleView的滑动滑入和划出屏幕,但是在一些其它场景下,我们不一定会用到RecycleView,假...
  • mChenys
  • mChenys
  • 2016年05月30日 21:27
  • 19188

Android 关于Scrollview和listview嵌套以及下拉刷新问题(附源码)

本人Android菜鸟,在做东西时候发现有时候我们需要在项目中使用scrollview和listview的结合才能使项目看起来更加完善,但是谷歌官网是不推荐scrollview和listview一起嵌...

Android中NestedScrollingParent嵌套ListView

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

ScrollView中嵌套Listview(两个)

  • 2015年05月08日 15:57
  • 1.43MB
  • 下载

对scrollview嵌套listview说不(一)

转载请指明出处:http://blog.csdn.net/u010339039/article/details/49838665 今年刚毕业然后就和同学来到了深圳。平时工作也不是很累,偶尔还挺闲。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对scrollview嵌套listview说不(二)NestedScrollingParent +RecyleView
举报原因:
原因补充:

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