2015-11-23 9 views
12

RecyclerViewにはItemDecoratorの2つを書いています。それぞれがgetItemOffsets()にトップオフセットを追加します。 RecyclerView ItemDecoratorのオフセットを取得する方法

  • セカンドdecratorは30DPトップを追加するオフセット

    • まずデコレータは20dpトップを追加することだ、私はRecyclerViewにそれらの両方を追加する場合、各項目が正しく50dpによってオフセットされ、今

    オフセット:さんが言ってみましょう良い。

    しかし、ここに質問があります: このオフセットはどのようにして得ますかonDraw/onDrawOver

    通常、デコレータは、parent.getChildAt(i)のものをトラバースし、の上の子ビューを描画するために、例えばchild.getTop()を取得することによって、それらのものを描画します。

    しかし、この場合、他のデコレータの図が混ざります。これはも使用するためです。

    したがって、現時点では、両方のデコレータがお互いの身長とお互いの身長を知る必要があるようです。

    ここに何か不足していますか?私は願っています。

    EDIT:Androidの問題追跡ツールに問題が報告されましたが、これはうまくいくようです。進捗状況を追跡するために、それをスター:https://code.google.com/p/android/issues/detail?id=195746

  • 答えて

    12

    TL; DRありません、あなたが何かを欠落していません。しかし、あなたは私に少し汚れているように見えますが、getItemOffsetsに必要な値を得ることができます。 、保持していないc.getClipBounds()onDrawLayoutManager.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オブジェクトと同様の操作を行います。

    +0

    詳細な回答ありがとうございます!現在の状況はそれほどうまくないと付け加えなければならないが、これは今のところ行うだろう。私はこれをAndroid Issue Trackerで問題を提出する時間を見つける必要があります。 – dimsuz

    +1

    @dimsuz私は現在の解決策について本当に良い気がして、うまくいくと思います。問題を提出する場合は、私にリンクを提供してください!ありがとう:) –

    +1

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

    関連する問題