2015-11-23 29 views
12

我已經爲RecyclerView寫了兩個ItemDecorator。每個在getItemOffsets()增加一些頂部偏移量。比方說:如何在RecyclerView中獲得偏移量ItemDecorator

  • 第一裝飾增添20dp頂偏
  • 二decrator增加30DP頂偏

現在,當我他們都加入到RecyclerView,每個項目都正確地50dp抵消,這是好。

但是問題出在這裏: 如何在onDraw/onDrawOver中得到這個偏移量?

通常修飾者通過遍歷parent.getChildAt(i)東西來繪製自己的東西,並獲得child.getTop()例如繪製RecyclerView的子視圖。

但是在這種情況下,這樣做會混淆其他裝飾器的繪製,因爲它也會使用child.getTop()

所以目前看起來好像兩個裝飾者都需要了解對方和對方的身高。

我在這裏錯過了什麼嗎?我希望我是。

編輯:我向Android問題跟蹤器報告了一個問題,似乎這將工作。明星它跟蹤的進展:https://code.google.com/p/android/issues/detail?id=195746

回答

12

tl; dr不,你沒有失去任何東西。但你可以得到getItemOffsets所需的值,雖然對我來說似乎有點骯髒。

基本上沒有變得比自己管理裝飾等裝飾的高度只有一個選項:LayoutManager.getDecoratedTop();

的onDraw

onDraw你得到recyclerView的整個畫布,c.getClipBounds()不成立任何信息。儘管添加裝飾的javadoc表示裝飾應該以的範圍繪製。

此外,得到parent.getLayoutManager().getDecoratedTop()會給你在每個裝飾相同的值,因爲它已經太晚了,這些值是爲了佈局的目的。

我們太晚了,佈局已經完成,我們錯過了。

getItemOffsets

請注意,我測試了LinearLayoutManager下,它可能也無法與其他人(不與大多數自定義的最絕的)工作。由於我依靠測量那些未記錄的調用之間的事件,因此給定的解決方案可能會與未來版本衝突。

我只是覺得我需要這個免責聲明。我發現了一個工作的解決方案(看mOffset):

@Override 
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
    mOffset = parent.getLayoutManager().getTopDecorationHeight(view); 
    outRect.set(0, 10, 0, 0); 
} 

這工作,因爲recyclerview,計算孩子的總插圖時,是updating the views package local LayoutParams variable。雖然我們不能自己訪問佈局參數變量,但調用getTopDecorationHeight實際上使用(當前)髒的插入,給我們適當的值。
因此,您可以在應用自己的裝飾之前獲得以前裝飾的偏移!

應用它,只是提請你裝修時要取出其他裝飾偏移:

c.drawRect(child.getLeft() + child.getTranslationX(), 
     mOffset + layoutManager.getDecoratedTop(child) + child.getTranslationY(), 
     child.getRight() + child.getTranslationX(), 
     child.getBottom() + child.getTranslationY(), paint); 

這將實際應用的其他裝飾偏移,然後從正確頂部繪製自己。

若干問題

這是目前對於默認的一個基本的,工作液用例但是。如果您有不同的偏移量,取決於項目VIEW_TYPE或適配器位置,則會變得棘手。

您將重複您的邏輯併爲各種視圖類型保留各種偏移量,或者您必須存儲/檢索每個視圖或視圖類型的偏移量。

要做到這一點,您可以添加一個自定義標籤view.setTag(key, object)或做一些類似的東西,類似於傳遞的RecyclerView.State對象。

+0

謝謝你的詳細解答!目前這樣做,但我必須補充說,目前的情況不是很好。我需要找點時間在Android問題跟蹤器中爲此提出問題。 – dimsuz

+1

@dimsuz我對目前的解決方案感覺非常好,並認爲它可能有效。如果您提出問題,請提供鏈接!謝謝:) –

+1

報告:https://code.google.com/p/android/issues/detail?id=195746 – dimsuz

相關問題