关于RecycleView的子元素锁定吸顶效果

  最近有一关于列表元素锁定吸顶的需求。处理方案比较简单的,在外层布局添加一个相同的标题栏控件,根据控件在滚动过中的位置来判断显示隐藏,从而达到效果。使用的关键代码是:

     int[] loc = new int[2];
     view.getLocationOnScreen(loc);
     int[] fitLoc = new int[2];
     outView.getLocationOnScreen(fitLoc);
     if (loc[1] <= fitLoc[1]){
          //外部标题栏显示
     }else{
          //外部标题栏隐藏
     }    

 在这个过程中,碰到几个问题:

1、当数据比较多,超过一个屏时,屏下所要固定的标题栏,显示状态时InVisible的状态,且所在屏幕位置坐标为(0, 0),这会导致显示判断的错误,这一情况做过滤处理;
2、当数据量从多到少或从少到多变化时,外层标题栏都要默认隐藏,列表标题栏都要默认显示(在onBindViewHolder()写);

以上如果是针对子项某一元素吸顶就够了,如果是对多个子元素需要吸顶需加如下处理:

1、列表的数据结构使用Map<TitleBean, List<ContentBean>>,的键值对, 重写的adapter的getItemCount()t,用TitleBean+ItemBean作为总数。这时我们可以建立算法(计算Map与List一一对应的对象),如果界面展示的是九宫格布局GridLayoutManager的方式,可以重写onAttachedToRecyclerView进行一维列表化。(关于公有/私有修饰,大家随意 )

   private Map<TitleBean, List<ContentBean<T>>> data = new TreeMap<>();  

   @Override
    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
        if (manager instanceof GridLayoutManager) {
            final GridLayoutManager gridManager = ((GridLayoutManager) manager);
            gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    return getItemViewType(position) != Type.Content ? gridManager.getSpanCount() : 1;
                }
            });
        }
    }


   private BaseTimeBean<T> getItemBean(int pos){
        if(data.isEmpty()) return null;
        int count = 0;
        for(TimeBean titleBean : data.keySet()){
            count++;
            if (count -1 == pos)
                return titleBean;
            else {
                List<ImageBean<T>> contentBeans = data.get(titleBean);
                if (count + contentBeans.size() -1 <= pos){
                    int index = pos-count;
                    return (index >= 0 && index < contentBeans.size()) ? contentBeans.get(pos- count) : null;
                }else {
                    count += contentBeans.size();
                }
            }
        }
        return null;
    }

   public class ItemBean<T>{
     public String id;
     public String name;
        public T t;
   }

   public class TimeBean extends ItemBaen{}

   public class ContentBean<T> extends ItemBean<T>{}            

2、添加列表控件的滑动监听了,如addOnScrollListener,重写onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy)方法,用布局管理器找第一个可是元素位置findFirstVisibleItemPosition,传入getTitleBean方法中,找打对应的数据, 进而赋值到吸顶控件上。

    private TitleBean getTitleBean(int pos){
        if(data.isEmpty()) return null;
        int count = 0;
        for(TitleBean titleBean : data.keySet()){
            count++;
            if (count -1 == pos)
                return titleBean;
            else {
                int size = data.get(titleBean).size();
                if (count + size -1 <= pos){
                    int index = pos-count;
                    return titleBean;
                }else {
                    count += size;
                }
            }
        }
        return null;
   }

 

原文链接:https://www.cnblogs.com/xiaofei100/p/17138235.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于RecycleView的子元素锁定吸顶效果 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • Android Studio相关问题

    下载 去官网下载即可,最新版如果运行不了,可选择安装其他版本,我安装的就是4.0版本 建立项目 一般就是建立一个空项目 如果使用过idea,那么建立项目就很简单。因为Android Studio和 idea 界面都差不多,功能也类似 步骤: File——New——New Project 会出现以下画面: 然后选择 Empty Activity 再点击 Nex…

    Android 2023年5月8日
    00
  • Android报”IllegalStateException”如何解决?

    下面我将详细讲解Android报”IllegalStateException”异常的原因和解决办法。 异常原因 “IllegalStateException”异常表示当前的操作状态不合法,通常是由于程序在使用某个资源时,资源的状态发生了不合法的变化导致的。在Android开发中,常见的”IllegalStateException”异常包括: Fragment…

    Android 2023年4月3日
    00
  • Opengl ES之矩阵变换(上)

    前言 说到矩阵变换,我们第一时间想到的就是大学时代的线性代数这些复杂的东西,突然有了一种令人从入门到放弃的念头,不慌,作为了一个应用层的CV工程师,在实际应用中线性代数哪些复杂的计算根本不用我们自己去算,绝大部分情境下直接使用Matrix这个类或者glm这个库即可。 关于矩阵与向量的相关知识,矩阵的加减乘除等规则,这里就不展开细说,感兴趣的同学自行查阅线性代…

    Android 2023年4月18日
    00
  • Android Banner – ViewPager 02

    Android Banner – ViewPager 02 现在来给viewpager实现的banenr加上自动轮播 自动轮播的原理,使用handler的延迟消息来实现。 自动轮播实现如下内容 开始轮播&停止轮播 可配置轮播时长、轮播方向 通过自定义属性来配置轮播时长,方向 感知生命周期,可见时开始轮播,不可见时停止轮播 感知手指触摸,触摸按下时停止…

    Android 2023年4月17日
    00
  • 应用内支付服务现网、沙盒环境下常见关键事件的对比与总结

    在集成和调试订阅型商品时,我们会依赖沙盒环境来进行模拟实际场景。 订阅型商品的购买流程和一次性商品的购买流程类似,但订阅还有其他细节场景,比如续订成功或失败,续订周期时长等。沙盒环境下的订阅续订时间会比正常情况更快,引入“时光机”概念帮助您快速测试您应用的订阅场景。比如订阅周期为1周,商品在3分钟后发生续期,此时订阅型商品有效期延长了3分钟。 下面对沙盒环境…

    Android 2023年4月18日
    00
  • 游戏内嵌社区服务开放,助力开发者提升玩家互动与留存

    华为 HMS Core 游戏内嵌社区服务提供快速访问华为游戏中心论坛能力,支持玩家直接在游戏内浏览帖子和交流互动,助力开发者扩展内容生产和触达的场景。 一、为什么要游戏内嵌社区? 二、游戏内嵌社区的典型使用场景 1、游戏内打开论坛 您可以在游戏内绘制论坛入口,为玩家提供沉浸式发帖、浏览、点赞、回帖、参与投票等各类互动体验。 说明:您可根据游戏风格,自定义论坛…

    Android 2023年4月18日
    00
  • 【原创】日语假名注音JpTextView

    支持日语假名注音的JpTextView 支持自动换行 支持自动宽高 支持一次标记或者总是标记 网上找了一下,发现没有类似的轮子,就自己造了一个源码:https://github.com/toukomine/JpTextView 1.引入依赖 代码已上传 mavenCentral仓库,在项目根目录的build.gradle的repositories节点加入以下…

    Android 2023年4月18日
    00
  • Android报”OutOfMemoryError”如何解决?

    针对Android报”OutOfMemoryError”异常的原因和解决办法,我会给您提供详细讲解。我们先来看一下什么是”OutOfMemoryError”。 什么是”OutOfMemoryError”? 在Java中,程序运行时经常会需要占用内存资源,对于Android应用而言,相对于Java来说,其内存受到了更大的限制,当程序占用的内存超过了系统为其分配…

    Android 2023年4月3日
    00
合作推广
合作推广
分享本页
返回顶部