序言
在垂直滑动的过程中可以横向滚动内容。
效果
代码
就一个工具类就行了。可以通过root view向上查找recycleView。自动添加滚动监听。在子view完全显示出来以后,才分发滚动事件。这样用户才能看清楚第一个。
需要一个id资源
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="key_rv_scroll_helper" type="id"/>
</resources>
RVScrollHelper
package com.trs.myrb.provider.scroll;
import android.view.View;
import android.view.ViewParent;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.trs.myrb.R;
import com.trs.myrb.douyin.action.TRSFunction;
/**
* <pre>
* Created by zhuguohui
* Date: 2023/5/12
* Time: 13:49
* Desc:用于监听recycleView的垂直滚动,然后将垂直滚动转发给其他类。
*
* //在provider中使用
* RVScrollHelper.create(binding.getRoot(), dy -> {
* binding.rvHotVideos.scrollBy(dy,0);
* return null;
* });
* </pre>
*/
public class RVScrollHelper implements View.OnAttachStateChangeListener {
TRSFunction<Integer, Void> scrollCallBack;
View child;
RecyclerView recyclerView;
private int recyclerViewHeight;
public static RVScrollHelper create(View child,TRSFunction<Integer, Void> scrollCallBack){
if(child==null){
return null;
}
Object tag = child.getTag(R.id.key_rv_scroll_helper);
if(!(tag instanceof RVScrollHelper)){
RVScrollHelper helper = new RVScrollHelper(child, scrollCallBack);
tag=helper;
child.setTag(R.id.key_rv_scroll_helper,helper);
}
return (RVScrollHelper) tag;
}
private RVScrollHelper(View child, TRSFunction<Integer, Void> scrollCallBack) {
this.scrollCallBack = scrollCallBack;
this.child = child;
this.child.addOnAttachStateChangeListener(this);
}
@Override
public void onViewAttachedToWindow(View v) {
if(child==null){
return;
}
if (recyclerView == null) {
recyclerView = getRecyclerView(v);
recyclerViewHeight = recyclerView.getHeight();
recyclerView.addOnScrollListener(onScrollListener);
}
}
@Override
public void onViewDetachedFromWindow(View v) {
if(recyclerView!=null) {
recyclerView.removeOnScrollListener(onScrollListener);
recyclerView=null;
}
}
private RecyclerView.OnScrollListener onScrollListener=new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
//只有在view全部显示出来以后,才发送滚动事件
boolean isAllShow=isAllShow();
if(isAllShow){
if(scrollCallBack!=null){
scrollCallBack.call(dy);
}
}
}
};
private boolean isAllShow() {
int top = child.getTop();
int bottom = child.getBottom();
return bottom>=0&&bottom<=recyclerViewHeight;
}
private RecyclerView getRecyclerView(View v) {
ViewParent parent = v.getParent();
while (!(parent instanceof RecyclerView) && parent != null) {
parent = parent.getParent();
}
if(parent!=null){
return (RecyclerView) parent;
}
return null;
}
}
使用
在provider中使用。
RVScrollHelper.create(holder.itemView, dy -> {
recyclerView.scrollBy(dy, 0);
return null;
});
作者:solo_99
原文链接:https://juejin.cn/post/7249985405125886009
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
全套视频资料:
一、面试合集
二、源码解析合集
三、开源框架合集
欢迎大家一键三连支持,若需要文中资料,直接点击文末CSDN官方认证微信卡片免费领取↓↓↓