TL; DRありません、あなたが何かを欠落していません。しかし、あなたは私に少し汚れているように見えますが、getItemOffsets
に必要な値を得ることができます。 、保持していないc.getClipBounds()
onDraw
でLayoutManager.getDecoratedTop();
onDraw
はあなたがrecyclerViewの全体のキャンバスを取得:
は、基本的には飾りを自分で管理する以外に装飾された高さを取得するだけオプションがあります任意の情報。デコレーションを追加するjavadocにも、デコレーションはの境界で描画する必要があります。
また、parent.getLayoutManager().getDecoratedTop()
を入力すると、すべての装飾に同じ値が表示されます。これはすでに遅すぎるため、レイアウト用です。
私たちは手遅れです、レイアウトが完了し、私たちはそれを逃しました。
getItemOffsets
私はLinearLayoutManager
で次をテストし、それが同様に(ほとんどのカスタムのものとほとんど間違いない)他の人と動作しない場合がありますのでご注意ください。文書化されていない呼び出し間で起こっている測定を頼りにしているので、その解決策は将来のバージョンでは破損する可能性があります。
私はちょうど免責条項が必要だと感じました。 recyclerviewは、子供の合計インセットを計算するとき、updating the views package local LayoutParams variableあるので、これは動作します
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
mOffset = parent.getLayoutManager().getTopDecorationHeight(view);
outRect.set(0, 10, 0, 0);
}
:私は、作業溶液を(mOffset
を見て)発見しました。レイアウトパラメータ変数自体にはアクセスできませんが、getTopDecorationHeightを呼び出すと実際には(現在)汚れたインセットが使用され、適切な値が得られます。
したがって、あなた自身のものを適用する前に、前の装飾のオフセットを得ることができます!あなたの装飾を描画するときにだけ、他の装飾を削除し、それを適用するに
オフセット:
c.drawRect(child.getLeft() + child.getTranslationX(),
mOffset + layoutManager.getDecoratedTop(child) + child.getTranslationY(),
child.getRight() + child.getTranslationX(),
child.getBottom() + child.getTranslationY(), paint);
これは、実際に他の装飾が正しいトップから自分を描き、その後、オフセットを適用します。
諸問題
これが今デフォルトのユースケースのための基本的な作業のソリューションです。 BUT。アイテムVIEW_TYPEまたはアダプタの位置によって異なるオフセットがある場合、処理が煩雑になります。
ロジックを複製し、さまざまなビュータイプに対してさまざまなオフセットを保持するか、すべてのビューまたはビュータイプに対してオフセットを格納または取得する必要があります。
カスタムタグを追加するには、view.setTag(key, object)
というカスタムタグを追加するか、または渡されたRecyclerView.State
オブジェクトと同様の操作を行います。
詳細な回答ありがとうございます!現在の状況はそれほどうまくないと付け加えなければならないが、これは今のところ行うだろう。私はこれをAndroid Issue Trackerで問題を提出する時間を見つける必要があります。 – dimsuz
@dimsuz私は現在の解決策について本当に良い気がして、うまくいくと思います。問題を提出する場合は、私にリンクを提供してください!ありがとう:) –
報告:https://code.google.com/p/android/issues/detail?id=195746 – dimsuz