Android如何实现联动滚动

该文介绍了一个名为RVScrollHelper的工具类,用于监听RecyclerView的垂直滚动并转发事件,确保在子视图完全显示后才执行滚动,优化用户体验。通过在布局中添加特定ID并在Provider中使用此工具类,可以实现特定的滚动交互效果。
摘要由CSDN通过智能技术生成

序言

在垂直滑动的过程中可以横向滚动内容。

效果

在这里插入图片描述

代码

就一个工具类就行了。可以通过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官方认证微信卡片免费领取↓↓↓

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android 中,可以使用 RecyclerView 和 ListView 来实现列表联动。下面分别介绍这两种方式的实现方法。 1. RecyclerView 实现列表联动 RecyclerView 是 Android 中比较新的列表控件,它提供了更加灵活的布局和样式定制方式。实现 RecyclerView 的列表联动,可以使用 RecyclerView 的滚动事件来监听列表的滚动位置,然后通过列表的滚动位置来计算联动列表中需要展示的内容。 具体实现步骤如下: 1)在布局文件中添加两个 RecyclerView 控件。 2)在代码中设置 RecyclerView 的 layoutManager,并为 RecyclerView 设置 Adapter。 3)为第一个 RecyclerView 添加滚动监听事件,监听其滚动位置。 4)在滚动监听事件中计算联动列表的滚动位置,并将其滚动到相应位置。 示例代码如下: ``` // 初始化 RecyclerView RecyclerView recyclerView1 = findViewById(R.id.recyclerView1); RecyclerView recyclerView2 = findViewById(R.id.recyclerView2); recyclerView1.setLayoutManager(new LinearLayoutManager(this)); recyclerView2.setLayoutManager(new LinearLayoutManager(this)); // 为 RecyclerView 设置 Adapter recyclerView1.setAdapter(adapter1); recyclerView2.setAdapter(adapter2); // 监听第一个 RecyclerView 的滚动事件 recyclerView1.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); // 计算联动列表的滚动位置 int firstVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition(); recyclerView2.scrollToPosition(firstVisibleItemPosition); } }); ``` 2. ListView 实现列表联动 ListView 是 Android 中较早的列表控件,它的使用方式和 RecyclerView 有所不同。实现 ListView 的列表联动,需要通过 ListView 的滚动监听事件来监听列表的滚动位置,然后通过滚动位置来计算联动列表中需要展示的内容。 具体实现步骤如下: 1)在布局文件中添加两个 ListView 控件。 2)在代码中设置 ListView 的 Adapter。 3)为第一个 ListView 添加滚动监听事件,监听其滚动位置。 4)在滚动监听事件中计算联动列表的滚动位置,并将其滚动到相应位置。 示例代码如下: ``` // 初始化 ListView ListView listView1 = findViewById(R.id.listView1); ListView listView2 = findViewById(R.id.listView2); // 为 ListView 设置 Adapter listView1.setAdapter(adapter1); listView2.setAdapter(adapter2); // 监听第一个 ListView 的滚动事件 listView1.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // do nothing } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // 计算联动列表的滚动位置 listView2.setSelection(firstVisibleItem); } }); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值