关于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日

相关文章

  • 关于移动开发平台,你想知道的这些事

    近年来,移动开发平台如雨后春笋般蓬勃发展。这诸多的移动开发平台常常令人面临选择恐惧。今天就来同大家一块盘点一下,看看这些移动开发平台都有什么特点与优势,希望为有需要的开发者提供一定的参考。   需要特别说明的是,这里提到的移动开发平台与 Flutter、React Native 等移动开发框架还有一定的区别,更多是指为开发者提供从开发、测试、发布和运营整个生…

    Android 2023年4月18日
    00
  • Android中设置Button为透明

    设置Button为透明状态,有两种最简单的方式: 1. 在layout.xml文件中的Button节点下,设置Button的Alpha属性,因为该属性在0~255范围内取值,0表示完全透明,255表示完全不透明; 但是此方法有一个缺点,当设置为0后,Button上的文字也看不见了。所以在项目中使用了第二种方法。 2. 在layout.xml文件中的Butto…

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

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

    Android 2023年4月18日
    00
  • 集成Health Kit时因证书问题出现错误码50063的解决方案

    一、问题描述及操作 应用集成Health Kit SDK后,在华为手机上进行登录授权时,返回错误码50063。 1、查看相关错误码。‘50063’在Health Kit错误码中的描述是“安装的HMS Core APK版本不匹配,无法调用接口。”提供的解决方案是“请安装最新版本的HMS Core(APK)后,再调用接口”。 2、根据文档中提供的解决方案,卸载了…

    Android 2023年4月17日
    00
  • 仿豆瓣发布-编辑框自适应高度,自动滚动定位到焦点输入

    效果图 随着输入的文本自动增加高度,键盘上方自定义菜单布局,随键盘弹起 点击编辑框,自动滚动到焦点处输入 布局层次 <ConstraintLayout>   <ScrollView>     <LinearLayout>        <Edittext/>       <自定义布局/>     &…

    Android 2023年4月18日
    00
  • 语言录制兼容长按跟点击录制

    录音需求中,往往有两种常规操作。 长按基本实现流程: 监听触摸事件,按下时录制,抬起时停止。 点击基本流程: 点击开始录制,在次点击停止录制 但是凡事有绝对,如果需要同时支持长按录制抬起结束跟点击录制在次点击结束呢?面对如此无理的需求,从技术层面上怎么如丝滑般去兼容呢。 需要两者兼容,只能从触摸事件入手了,这里的重点其实就在于怎么在触摸事件中去区分点击事件跟…

    Android 2023年4月22日
    00
  • Android报”ClassCastException”如何解决?

    Android中,”ClassCastException”异常表示向下转型时出现类型转换错误。通常情况下,这种错误可能是由于将一个对象引用从其父类转换为其子类时发生的,而该对象实际上不是该子类的实例。此时会抛出ClassCastException异常。 处理”ClassCastException”异常最常见的方法是使用合适的Java类型检查和类型转换技术,以…

    Android 2023年4月3日
    00
  • 接入HMS Core应用内支付服务过程中一些常见问题总结

    华为HMS Core应用内支付服务(In-App Purchases,IAP)为应用提供便捷的应用内支付体验和简便的接入流程。该服务支持客户端和服务端两种开发形式,具体可以参考官方文档。 往期文章:常见问题总结(2)中分享总结了有关无法拉起支付页面的常见问题,本文将对近期开发者们较为关注的一些集成应用内支付服务过程中的问题进行汇总,并提出解决方案。 问题1:…

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