如何确定交错网格布局管理器中的列位置

时间:2016-02-03 21:48:23

标签: android staggeredgridlayout

我正在使用交错的回收站视图布局来获取照片列表。我希望两侧的间距为零,同时两列之间仍有空间。我正在使用项目装饰子类来获取附加照片中看到的间距。我知道我可以控制左右间距,但问题是我从来不知道照片所在的列。看起来交错的布局管理器会进行一些自己的重新排序。我尝试过使用getChildAdapterPosition,但它似乎返回数据源数组中的位置,而不是布局中照片的实际位置。知道我应该如何处理这个问题吗? enter image description here

2 个答案:

答案 0 :(得分:32)

我设法让它发挥作用。所以在我的情况下,我不需要在屏幕的左右边缘上有任何边框。我只需要中间和底部的边框。解决方案是获取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上我有一个没有任何边框的标题视图。之后我得到了span索引,并根据它设置了我在该视图上需要的边框。最后,我在每个视图上设置了底部边框。

答案 1 :(得分:4)

所以我能够使用的一个解决方案是使用项目装饰器,但它确实有点奇怪/ hacky感觉。

基本上,您可以根据列的位置(或类似的东西)调整项目的外部矩形。我的理解是外部矩形或多或少是你想要改变的间距。尝试下面的代码,显然你需要自己做出调整和逻辑来计算'该项目所在的列,但这应该足以弄明白,希望:

recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            int left = outRect.left;
            int right = outRect.right;
            int top = outRect.top;
            int bottom = outRect.bottom;
            int idx = parent.getChildPosition(view);
            int perRow = gridLayoutManager.getSpanCount();

            int adj = blahh... // some adjustment

            if (idx < itemsPerRow) {
                // on first row, adjust top if needed
            }

           if(idx % perRow == 0){
                // on first column, adjust. Left magically adjusts bottom, so adjust it too...
                left += adj;
                bottom -= adj;
           }

           if(idx % itemsPerRow == perRow - 1){
               // on last column, adjust. Right magically adjusts bottom, so adjust it too...
               right += adjustment;
               bottom -= adjustment;
           }

            outRect.set(left, top, right, bottom);
        }
    });

再次这是hacky并且需要一些试验和错误才能正确。

我尝试取得一些成功的另一个解决方案是为不同的列定义不同的视图。在您的情况下,列左侧和右侧的视图具有不同的负边距,以获得您想要的效果。

作为旁注,我假设您在卡片视图上使用了高程。我注意到的一件事是,如果卡片视图没有高度,而是你自己处理它(是的,我知道,并不是你自己不能处理高度的问题),这种困难很大程度上消失了事情开始表现,可能是因为高程/阴影计算。但无论如何......希望这至少有点帮助...

相关问题