23

写真のリストに千鳥リサイクラー ビュー レイアウトを使用しています。2 つの列の間にスペースを確保しながら、側面の間隔をゼロにしたい。添付の写真に見られる間隔を取得するために、アイテム装飾サブクラスを使用しています。左右の間隔を制御できることはわかっていますが、問題は、写真がどの列にあるのかわからないことです。ずらしたレイアウトマネージャーが独自の並べ替えを行っているようです。使用してみましgetChildAdapterPositionたが、レイアウト内の写真の実際の位置ではなく、データ ソース配列内の位置を返すようです。これにどのようにアプローチすべきか考えていますか? ここに画像の説明を入力

4

2 に答える 2

40

私はそれを機能させることができました。私の場合、画面の左端または右端に境界線は必要ありません。真ん中と下に境界線が必要です。解決策は、StaggeredGridLayoutManager.LayoutParams タイプのビューのレイアウト パラメータを取得することです。これらのパラメーターでは、ビューがどのインデックスにあるかを示す spanIndex を取得できます。したがって、spanCount が 2 の場合、左側のビューの spanIndex は 0 になり、右側のビューの spanIndex は 1 になります。

これが私のコードです。多分それはあなたを助けるでしょう。

public class SpaceItemDecoration extends RecyclerView.ItemDecoration {
    private int space;

    public SpaceItemDecoration(int space) {
        this.space = space;
    }


    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        int position = parent.getChildAdapterPosition(view);

        StaggeredGridLayoutManager.LayoutParams lp = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();
        int spanIndex = lp.getSpanIndex();

        if (position > 0) {
            if (spanIndex == 1) {
                outRect.left = space;
            } else {
                outRect.right = space;
            }

            outRect.bottom = space * 2;
        }
    }
}

私の場合、最初に位置を取得する必要があります。これは、インデックス 0 に境界線を持たないヘッダー ビューがあるためです。その後、スパン インデックスを取得し、それに応じてそのビューに必要な境界線を設定します。最後に、すべてのビューに下の境界線を設定します。

于 2016-02-05T14:29:40.297 に答える