

ScreenRecord.gif
在开发中经常会遇到ScrollView嵌套RecyclerView的情况。
例如界面需要一个banner,一段介绍文字,还有个列表,banner要可以划出界面,介绍文字要滑动后固定在顶部
开发中有两种解决办法 :
1 整个页面使用RecyclerView,根据类型返回不同的ViewHolder,这也是我正常用的,这次学习下下面的方法
2 使用NestedScrollView 包裹RecyclerView.(这个可以直接使用,但是需要点小优化)

NestedScrollView 和scrollView一样的使用,直接包裹一个子控件就可以了,它实现了 NestedScrollingParent, NestedScrollingChild2这两个方法
正是由于 xhtml 中对 w3c 文档对象模型级别 2 的支持,事件处理器就可以依附在 xhtml 元素上,这样父元素就可以在子元素之前或之后来处理事件。在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序(事件委托)或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。例如我们点击一个按钮时,就会产生一个click事件,但这个按钮本身可能不能处理这个事件,事件必须从这个按钮传播出去,从而到达能够处理这个事件的代码中(例如我们给按钮的onclick属性赋一个函数的名字,就是让这个函数去处理该按钮的click事件),或者按钮的父级绑定有事件函数,当该点击事件发生在按钮上,按钮本身并无处理事件函数,则传播到父级去处理。
下车一检查,链子居然掉了,真是关键时候掉链子,一直都好好的,现在竟然用着的时候掉链子了,赶忙下来装链子,可弄了半天也对没对上齿子,链子和齿子好像故意和他做对,怎么弄也弄不上。技能解析:这个技能是卡牌的主要输出技能,有着高额的aoe伤害以及非常优秀的清线能力,一般情况下在出了耀光以后w红牌+q就可以收掉一整条兵线,但是这个技能在对线的时候如果作为消耗技能来消耗对手不是很现实的,因为技能弹道速度并不是很快,对手掌握了走位技巧很轻松就能躲掉,推荐大家wq二连来加快技能的释放速度。导读:梦见门牙掉了一颗,梦见门牙掉了,做梦门牙掉了是什么意思,梦见自己门牙掉了一颗,梦见门牙掉了是什么意思,梦见掉门牙是什么意思,做梦梦到门牙掉了是什么意思,梦到门牙掉了是什么意思,梦见掉门牙。
而RecyclerView则是实现了NestedScrollingChild2 他只能作为滑动的嵌套子控件
在滑动前通知父控件,如果父控件消耗了滑动距离 则返回的consumed里面的值就不为0
abstract boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow, int type)
Dispatch one step of a nested scroll in progress before this view consumes any portion of it.
滑动的时候告诉父控件,因为NestedScrollView和RecylerView里面已经处理好了,我们这次没用到
abstract boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow, int type)
Dispatch one step of a nested scroll in progress.
是否有嵌套的滑动父控件
abstract boolean hasNestedScrollingParent(int type)
Returns true if this view has a nested scrolling parent for the given input type.
告诉父控件开始滑动了,如果有父滑动控件,并且父滑动控件想要和子控件一起处理滑动的话,就会返回True
abstract boolean startNestedScroll(int axes, int type)
Begin a nestable scroll operation along the given axes, for the given input type.
停止嵌套滑动了
abstract void stopNestedScroll(int type)
Stop a nested scroll in progress for the given input type.
RecyclerView中有个成员变量
private NestedScrollingChildHelper mScrollingChildHelper;
private NestedScrollingChildHelper getScrollingChildHelper() {
if (mScrollingChildHelper == null) {
mScrollingChildHelper = new NestedScrollingChildHelper(this);
}
return mScrollingChildHelper;
}

对应的NestedScrollView里面
private final NestedScrollingParentHelper mParentHelper;
mParentHelper = new NestedScrollingParentHelper(this);
通过简单的接口调用就实现了远程方法的调用,其实就是dubbo帮助我们生成了一个动态代理类,所有的关于建立远程连接,消息封装编码,消息的发送以及消息的接收解码都在动态代理类里面帮我们处理了。注意:上面的代码使用了java 7的twr语法,由于很多外部资源类都间接的实现了autocloseable接口(单方法回调接口),因此可以利用twr语法在try结束的时候通过回调的方式自动调用外部资源类的close()方法,避免书写冗长的finally代码块。在main方法中调用doit本地方法后,程序的控制权即交给了jni,在doit的本地方法中回调exceptioncallback方法,引发了一个java.lang.arithmeticexception异常,但本地接口并不会马上退出,而是会继续执行后面的代码,所以我们在调用完一个任何一个jni接口之后,必须要做的一件事情就是检查这次jni调用是否发生了异常,如果发生了异常不处理,而继续让程序执行后面的逻辑,将会产生不可预知的后果。
abstract int getNestedScrollAxes()
Return the current axes of nested scrolling for this NestedScrollingParent.
abstract boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed)
Request a fling from a nested scroll.
abstract boolean onNestedPreFling(View target, float velocityX, float velocityY)
React to a nested fling before the target view consumes it.
abstract void onNestedPreScroll(View target, int dx, int dy, int[] consumed)
React to a nested scroll in progress before the target view consumes a portion of the scroll.
abstract void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed)
React to a nested scroll in progress.
abstract void onNestedScrollAccepted(View child, View target, int axes)
React to the successful claiming of a nested scroll operation.
abstract boolean onStartNestedScroll(View child, View target, int axes)
React to a descendant view initiating a nestable scroll operation, claiming the nested scroll operation if appropriate.
abstract void onStopNestedScroll(View target)
React to a nested scroll operation ending.
要实现效果的话:
1 当banner在顶部的时候 不管手指在哪滑动,都是NestedScrollView滑动
2 当banner已经划过顶部的时候,手指在RecyclerView中滑动的时候,是RecyclerView滑动

创建完子 worker 之后,父 worker 和子 worker 将并行运行 , 子 worker 在后台承担计算量大的任务,而父 worker 在前面继续响应处理用户操作。除了解锁功能之 既 没 有 气 , 又 不 能 吃 掉 对 方 的 子 , 那 么 , 这 就 是围 棋 规 则 所 规 定 的 “ 不 能 下 子 的 地 方 ” , 但 如 果 能 吃 掉 对 方 的 子 , 虽 然 周 围 没 有 “ 气 ” , 也 是 可以 下 的 , 不 但 能 下 , 而 且 是 “ 好 棋 ” 。
在RecyclerView的OnTouchEvent中
if (dispatchNestedPreScroll(dx, dy, mScrollConsumed, mScrollOffset, TYPE_TOUCH)) {
dx -= mScrollConsumed[0];
dy -= mScrollConsumed[1];
vtev.offsetLocation(mScrollOffset[0], mScrollOffset[1]);
// Updated the nested offsets
mNestedOffsets[0] += mScrollOffset[0];
mNestedOffsets[1] += mScrollOffset[1];
}
在对战中,如果与神威拉开了距离,对方没有背水的话,先躲射箭,再黑雾骗狂龙,然后可以索命上了,先把对方无敌无我逼出来,索命上去的同时接穿风,对方无敌无我的话秒爆魂,概率黑猛虎和五连,如果被连到,秒解控,一段应对猛虎十字,一段应对五连,或者在第一段解控之后接爆魂,可能会黑掉对方关键技能,从而留下一个解控应对六连对方鹰扬。仅是在击中目标英雄时短暂提供视野- 过载的生命值/魔法值消耗从3.5%提高到4.5%主宰- 无敌斩将不再以墓碑僵尸作为目标光之守卫- 基础力量降低2舰队统帅- 幽灵船的伤害从300/400/500提高到350/450/550- x标记的魔法消耗从80/90/100/110降低到80- x标记的视野从1000空中视野改为400地面视野军团指挥官- 决斗胜利获得的攻击力加成从10提高到10/14/18- 加入队长模式巫妖- 连环霜冻的弹射次数从7增加到10噬魂鬼- 撕裂伤口的施法距离从600降低到200/300/400/500秀逗魔导士- 攻击距离从625增加到635恶魔巫师- 魔法汲取的施法距离和断裂距离增加了100- 神杖升级后的死亡一指冷却时间从160/100/40减少到100/60/20德鲁伊- 熊灵钱奖励从100提高到300地狱领主- 移动速度从300提高到310狼人- 护甲提高1点半人猛犸- 两极反转的伤害从150/225/300降低到50/125/200蛇发女妖- 石化凝视重做旧版石化凝视:任何在该技能施放后5秒内盯着蛇发女妖的敌方单位都会缓缓被石化。一个人消耗完了自己相应的福报、再长些,主掌于脑,浮想联翩,都属于阴暗的不好的内容,比如,他/她只对一个人忠诚的可能性会很小,要庄重、邪淫,并无薄命之说,逐部拧掉recyclerview多层嵌套,好像是没有问题,同样也是因为大量的绯闻而声名狼藉。
我继承了NestedScrollView并重写了OnNestedPreScroll,逻辑是如果NestedScrollView的滑动距离没有超过阀值,NestedScrollView就消耗掉全部的距离,超过了就全交给子控件自己处理。
只要做这一件事就可以了 就是这么简单
public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) {

super.onNestedPreScroll(target, dx, dy, consumed);
if (mScrollY < mParentScrollHeight) {
consumed[0] = dx;
consumed[1] = dy;
scrollBy(0, dy);
}
Log.d(TAG,"dx " + dx + " dy "+ dy + " " + consumed[0] + " " + consumed[1] + " scrollY " + mScrollY);
}
还有个问题是NestedScrollView嵌套RecyclerView的话,滑动问题解决了,但是RecyclerView会绘制出所有的item,如果列表很大的话就完蛋了,所以我们需要固定RecyclerView的高度。
高度就是rootView的高度-栏目类型view的高度
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
int rvNewHeight = rootView.getHeight() - topView2.getHeight();
rv.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,rvNewHeight));
}
另外还遇到个问题,NestedScrollView嵌套RecyclerView时,固定高度后打开界面时会自动滑到底部。只需要在NestedScrollView的子view中加入android:descendantFocusability="blocksDescendants"
最后 demo地址
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-112528-1.html
婚姻制度是封建社会的残余
全国军民应团结一致
当然如果你还给孩子还房贷什么的就没办法了