關於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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...