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
對象。
謝謝你的詳細解答!目前這樣做,但我必須補充說,目前的情況不是很好。我需要找點時間在Android問題跟蹤器中爲此提出問題。 – dimsuz
@dimsuz我對目前的解決方案感覺非常好,並認爲它可能有效。如果您提出問題,請提供鏈接!謝謝:) –
報告:https://code.google.com/p/android/issues/detail?id=195746 – dimsuz