關於RecycleView的子元素鎖定吸頂效果

来源:https://www.cnblogs.com/xiaofei100/archive/2023/03/03/17138235.html
-Advertisement-
Play Games

前言 內容類應用中圖片或文件下載,一般應用中應用更新和升級,這些都是經典的下載場景。下載是項目中基礎且重要的模塊。 從代碼邏輯復用性和人力成本考慮,一直想實現一個純Dart實現的下載庫,作為技術儲備。 最近發現了一個純Dart實現的下載庫flutter_download_manager,相對來說各方 ...


  最近有一關於列表元素鎖定吸頂的需求。處理方案比較簡單的,在外層佈局添加一個相同的標題欄控制項,根據控制項在滾動過中的位置來判斷顯示隱藏,從而達到效果。使用的關鍵代碼是:

     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;
   }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [暫無答案] 1.硬體中斷號和Linux內核的IRQ號它們是如何映射的?2.當發生硬體中斷之後,ARM64處理器架構做哪些工作?3.為什麼說中斷上下文不能執行睡眠操作?4.一個硬體中斷後,Linux內核如何響應並處理中斷?5.同一類型的軟中斷是否允許多個CPU並行執行?6.軟中斷上下文包括哪幾種情況 ...
  • 上一篇介紹了springboot的代碼壓縮實現,本地調試也是沒有問題,但是當項目部署至伺服器就不行了,還需要Linux配置和下載壓縮所需要的工具ffmpeg,我們伺服器用的是centos7,下麵開始實現步驟。 第一步、先在Linux伺服器配置及下載壓縮插件 一、找到下載目錄 cd /usr/loca ...
  • 環境: DNS伺服器:192.168.10.200 僅主機模式 internet伺服器:192.168.10.123 僅主機模式 web1:10.0.0.100 (安裝apache2)NAT模式 web2:10.0.0.18 (安裝httpd) NAT模式 HAProxy伺服器:10.0.0.8(配 ...
  • 袋鼠雲數棧從2016年發佈第⼀個版本開始,就始終堅持著以技術為核⼼、安全為底線、提效為⽬標、中台為戰略的思想,堅定不移地⾛國產化信創路線,不斷推進產品功能迭代、技術創新、服務細化和性能升級。 在數棧過去的產品迭代中受限於當前組件的版本,積累了很多待解決的問題,隨著新的功能需求不斷增加,很多原先的組件 ...
  • 1.instantclient工具 下載安裝Oracle資料庫的客戶端連接工具“instantclient”,該工具是遠程連接Oracle資料庫的前提,不管是使用PL/SQL或應用程式訪問資料庫都必須安裝該工具。 下載地址:鏈接:https://pan.baidu.com/s/1glZGRJeQ-W ...
  • MySQL主鍵和外鍵知識點 | 主鍵的概念 | 主鍵的創建 | desc 表名 | show create table 表名; | 自增列起 始值設置 | 設置自增列初始值語句 | 自增列步長設置 | 唯一索引知識點 | 創建唯一索引的方式 | 外鍵變種 詳細知識點 | 什麼是外鍵變種 | 外鍵變種... ...
  • 案例需求: 假設用戶需要每個1秒鐘需要統計4秒鐘 視窗中數據的量,然後對統計的結果值進行checkpoint處理 ##### 數據規劃 使用自定義運算元每秒鐘產生大約10000條數據 產生的數據為一個四元組(Long,String,String,Interger)-- (id,name,info,co ...
  • 資料庫系統概論—基礎篇(1) 一、緒論 1.資料庫系統概述 1.1資料庫四個基本概念 數據:描述事物的符號記錄 資料庫(DB):存放數據的倉庫 資料庫管理系統(DBMS):位於用戶與操作系統之間的一層數據管理軟體 資料庫系統(DBS):由資料庫,資料庫管理系統,應用程式和資料庫管理員組成 1.2數管 ...
一周排行
    -Advertisement-
    Play Games
  • .NET Core 選項系統的主要實現在 Microsoft.Extensions.Options 和 Microsoft.Extensions.Options.ConfigurationExtensions 兩個 Nuget 包。對於一個框架的源碼進行解讀,我們可以從我們常用的框架中的類或方法入手 ...
  • 最近在工作中遇到一個問題,就是我有多個線程會調用bitmap對象,運行的時候報錯,對象當前正在其他地方使用。第一反應肯定是加鎖啊,於是我就在每個用到bitmap的地方都加了鎖,但是運行之後依然報這個錯 測試代碼如下 using System; using System.Drawing; using ...
  • 一:背景 1. 講故事 前段時間有位朋友微信找到我,說他的程式使用 hsl 庫之後,採集 plc 時記憶體溢出,讓我幫忙看一下怎麼回事,哈哈,貌似是分析之旅中的第二次和 hsl 打交道,既然找到我,那就上 windbg 說話吧。 二:WinDbg 分析 1. 為什麼會記憶體溢出 簡單觀察程式的提交記憶體之 ...
  • 在 IIS 上啟用 Websocket 在 Windows Server 2012 或更高版本上啟用對 WebSocket 協議的支持: 備註 使用 IIS Express 時無需執行這些步驟 通過“管理”菜單或“伺服器管理器”中的鏈接使用“添加角色和功能”嚮導。 選擇“基於角色或基於功能的安裝”。 ...
  • C#-垃圾回收機制(GC) 什麼是GC 官網中有這麼一句話: The garbage collector is a common language runtime component that controls the allocation and release of managed memory ...
  • 呆了2個大屏行業的公司,對大屏幕有一些瞭解,所以整理下所瞭解的觸摸屏相關概念。方便自己以及進入這個行業的小伙伴們,能有個系統、快速的認知。 觸摸屏詳細的知識點,網上其實都有。整理資料過程中,我也瞭解了更多的觸摸屏知識,像聲波屏、光學屏之類的之前就沒接觸。下麵分不同的模塊,給大家介紹 交互觸摸屏類型 ...
  • 近段時間忙於各種項目和對【易排平臺】的優化,沒顧得上分享APS相關的小技巧,回頭看看小公眾號的關註人數早已達1500+,在此爭取時間寫一下這段時間在項目上及平臺優化過程中遇到的一些小技巧,以感謝諸位的關註。過去數月的解決的問題中,涉及最多的是規劃模型中,實現各種時間維度的功能,目前在平臺上也稍有成果 ...
  • 針對大量log日誌快速定位錯誤地方 動態查看日誌 tail -f catalina.ou 從頭打開日誌文件 cat catalina.ou 可以使用 >nanjiangtest.txt 輸出某個新日誌去查看 [[email protected] logs]# cat -n catalina.out |grep 7 ...
  • 前言 RocketMQ是阿裡巴巴旗下一款開源的MQ框架,經歷過雙十一考驗、Java編程語言實現,有非常好完整生態系統。RocketMQ作為一款純java、分散式、隊列模型的開源消息中間件,支持事務消息、順序消息、批量消息、定時消息、消息回溯等 本篇文章第一部分屬於一些核心概念和工作流程的講解;第二部 ...
  • 在java,c#類的成員修飾符包括,公有、私有、程式集可用的、受保護的。 對於python來說,只有兩個成員修飾符:公有成員,私有成員 成員修飾符是來修飾誰呢?當然是修飾成員了。那麼python類的成員包括什麼呢? python成員: 欄位,方法,屬性 每個類成員的修飾符有兩種: 公有成員:內部外部 ...