PTR原始碼心得(一)

2021-07-12 01:56:01 字數 2015 閱讀 5918

pulltorefresh(ptr)是非常常用的乙個控制項,雖然因為理念的問題,已經算是落後,並且已經停止維護,但是總得來說是十分實用的控制項,並且其中很多的設計理念都還算非常縝密。

最近因為專案需要,需要對ptr進行一些改進,所以第一次系統的讀了一下ptr的**,也是第一篇的csdn的部落格。

1.設計概述

ptr支援的空間包括gridview/ scrollview/ expandablelistview/ recyclerview/ scrollview/ webview多個

從設計的角度,ptr的作者希望將整個ptr作為乙個元件而非乙個容器進行設計,所以希望ptr不但能夠完成下拉重新整理的功能,也需要對其中的元件進行屬性控制,從設計模式的角度出發,設計的耦合度會比較高,不利於擴充套件和修改,所以這也是系統落後的乙個原因。

ptr核心的類包括pulltorefreshbase(ptrbase)、 pulltorefreshadapterviewbase(ptradapter)、 loadinglayout,支援的元件全部繼承自ptradapter,ptradapter繼承自ptrbase,模擬了乙個adapter的行為。而pulltorefreshbase則實現了所有下拉重新整理和上拉載入的功能基礎,loadinglayout實現了重新整理的header和footer,在ptrbase中進行實現初始化。

在ptr中,設定了2種方向5種模式和6種狀態,以設定ptr的行為。

ptr的方向,當然包括水平和垂直,不同的方向會載入不同的loadinglayout,實現不同的布局屬性等。

當然從設計模式來說,不算是乙個好的設計結構,理想的狀態,當然是不管是水平還是垂直,都可以採用同乙個自適應的header,否則的話,如果進行擴充套件,工作量就會加倍

通過設定ptr的mode可以選擇五種狀態為disable(不能下拉)、pull_from_start(下拉以重新整理)、pull_from_end(上拉載入更多)、both(都可以)、manual_refresh_only(只允許手動重新整理)。

看過ultrapulltorefresh的設計思路之後,確實覺得這種設計方法不好,因為下拉重新整理和上拉載入更多所承載的功能並不相同。從設計模式的單一功能的原則來說,這樣並不合理,但是在當時來說,應該也是源自某個專案。並且disable這個狀態也設定的有一些多餘。

幾種狀態為reset(回歸原狀態)、pull_to_refresh(下拉但是沒有達到重新整理位置)、release_to_refresh(已經達到了重新整理位置,可以進行重新整理)、refreshing(重新整理中)、manual_refreshing (手動重新整理)、 overscrolling (這個不知道怎麼翻譯)。

個人感覺狀態的設定比較瑣碎,在閱讀**中,覺得這個過程可以化簡為,重新整理前、重新整理、重新整理後,甚至可以更加簡化為重新整理與未重新整理,當然uptr採用的是前者,閱讀**時的感覺,這些狀態也是作者在設計ptr的過程中不斷新增以應對深度耦合帶來的修改不便的情況,導致了**的行數的無畏增加,因為很多狀態並沒有什麼有用的實現。

這兩個介面中生命loadinglayou和ptrbase的屬性設定方法,包括文字顏色和重新整理的drawable等。

如果是僅僅是對屬性進行設定,可以寫成loadinglayout的set的方法,並且設定一些預設的屬性,因為字型顏色、重新整理時進行動畫的drawable這些屬性,都不是必須同時設定並且必須的,而且既然重新整理時的提示語都可以採用設定好的string,那這些應該也可以吧。設定成乙個藉口,沒有太大的必要了。

在對ptr的原始碼閱讀之前,由於專案需求了解了ultrapulltorefresh的設計思路和一部分**,從設計的角度來說,由於uptr的作者秋百萬前輩也借鑑了很多ptr種的思路(後面會說),所以uptr的設計更加的先進。並且uptr僅僅實現了下拉重新整理的功能,所以整個專案更加的乾淨靈活。

我自己的看法中,寫出了ptr的一些問題,也不敢有所指點,畢竟我也是乙個新手,但是覺得設計乙個元件,可能考慮到設計模式的一些準則,可能會使**的可讀性更好一點,擴充套件性更強一點吧。

原始碼閱讀心得

簡單記錄一下自己最近一段時間閱讀乙個c語言開源專案的心得 1 閱讀工具 source insight 4.0 gdb typora 2 閱讀心得 1 不要陷在 的實現細節裡面出不來,浪費時間。因為稍微大一點的開源專案,都有很多自定義的結構體,這些結構體封裝了大量的實現細節,特別是c語言的指標滿天飛,...

set原始碼之心得

c 的stl很強大,強大到我只願慵懶地去使用而不知其所以然。直到李師問我,我的回答被李師否定,我方才意識到自己是多麼地淺陋。希望自己有空抽時間把stl原始碼給研究一下,化為自己真正可以掌控的力量。set容器的原型 templateclass compare less,class alloc stl ...

MapReduce原始碼分析心得

分布式計算追求 沒有計算發生。支撐了計算向資料移動,和計算的並行度。做的最主要的是 儲存與計算解耦,就是對所要進行切片的資料進行split切片,split map並行度 split預設是與block塊數量一致,目的是為了計算向資料移動,幾個block塊分布在幾個地方,就起幾個map,這樣就不需要讓大...