自定義 LayoutManger需要注意的幾個地方

2021-09-16 14:21:02 字數 2510 閱讀 8213

最近寫銷控表,需要有上萬個資料**的情況,

首先感謝 的帖主,給了大家乙個非常好的例子。本文也是根據他的帖子的原理,整理了自己在編寫銷控表的時候遇到的問題。

很多demo 在onlayoutchildren 方法中 進行兩個動作,乙個是計算得到真實的最大寬高,乙個是進行layout的動作, 我的觀點,一旦外部資料獲得的那時候,完全可以給實體新增字段計算好,左上右下的位置,把實體扔進來,比如新增下面的字段,進行定位的時候就很簡單方便了

,即使是遇到異型單元格,比如有些單元格橫向有合併,或者有些單元格縱向有合併的情況,也方便處理。

//輔助在 onlayoutchildren 進行layoutdecoratedwithmargins的定位

//需要布局的單元的寬度

private

int width;

//需要布局的單元的高度

private

int height;

//需要布局的單元的左邊位置

private

int left;

//需要布局的單元的上邊位置

private

int top;

layoutdecoratedwithmargins的時候 就可以直接把資料bean扔進來解決問題

layoutdecoratedwithmargins

(view, bean.

getleft()

- moffsethorizontal, bean.

gettop()

- moffsetvertical, bean.

getleft()

+ bean.

getwidth()

- moffsethorizontal, bean.

gettop()

+ bean.

getheight()

- moffsetvertical)

;

很多demo在for迴圈一開始就去recycler.getviewforposition(i),但這會有乙個問題,當你的view特別多時,我遇到的是,可能有上萬資料。這個時候 for迴圈的時候先去recycler.getviewforposition(i); 會導致上萬次的獲取view ,這樣的話,即使你在 rect.intersects(mlayoutstate.mslidearearect, itemrect) 為 false 的時候去呼叫removeandrecycleview(view, recycler); 進行view 的**,依然會存在效能和卡頓問題。

但如果你根據螢幕是否可見,再去getview ,那個總共需要獲取的view數,只是螢幕可見的那些個,理論上頂多100到200個,每次滑動的時候,scrollhorizontallyby 或者 scrollverticallyby中可以detachandscrapattachedviews ,進行**,效能大大提高。比如下面的**,在view 不再螢幕可見的時候,也不需要執行removeandrecycleview(view, recycler); 也不會卡頓,因為滑動的時候,一般都會去呼叫detachandscrapattachedviews

private

void

fillchildren2

(recyclerview.recycler recycler, recyclerview.state state)

rect itemrect =

newrect()

;//處理header

int displaynum =0;

int skipnum =0;

for(

int i =

0; i < itemlist.

size()

; i++

)else

} log.e(

"layoutmanager"

,"displaynum"

+ displaynum)

; log.e(

"layoutmanager"

,"skipnum"

+ skipnum)

;}

當你繪製一遍所有子view 後,你會發現,當你把這些在layoutmanger繪製過的view 重新拿出一些依照你的需求擺放時,可能這樣說很抽象,給個圖, 如下圖這種銷控表,當你需要固定樓層那一列,基本上做法是重新拿出已經擺放在底層的,再繪製一遍在指定的固定位置,這個時候你會發現這些重新繪製的view的itemdecoration不見了,但參考官網說法,itemdecoration中的ondraw是繪製在最底層的,從下到上是canvas → itemdecoration → 你第一次繪製的view → 你第二次繪製的view ,就是說不管是否是第二次繪製的view ,itemdecoration 始終是在最底層,所以給人一種第二次繪製的view沒有itemdecoration 的假象,因為他會被第一次繪製view 的遮住。

自定義 如何自定義協議

何為自定義協議,其實是相對標準協議來說的,這裡主要針對的是應用層協議 常見的標準的應用層協議如http ftp smtp等,如果我們在網路通訊的過程中不去使用這些標準協議,那就需要自定義協議,比如我們常用的rpc框架 dubbo,thrift 分布式快取 redis,memcached 等都是自定義...

自定義控制項 自定義鐘錶

private context mcontext 畫筆 private paint mpaint 控制項的寬 private int mwidth x方向的圓心座標 private int center 鐘錶的半徑 private int mradio 圓環的寬 private int stroke...

自定義控制項及自定義屬性

自定義控制項在android開發中的重要性,是不言而喻,眾人皆知的。希望通過這二天的學習,能讓大家了解自定義控制項的原理,熟悉自定義控制項的使用步驟,並能寫出一些普通的效果。內容介紹 1 使用系統控制項,實現自定義的效果,案例有 優酷環形選單 廣告條 viewpager 下拉列表 spinner 2...