Android 如何使GridLayoutManager使用动态空间?

Android 如何使GridLayoutManager使用动态空间?,android,android-layout,android-gridlayout,gridlayoutmanager,Android,Android Layout,Android Gridlayout,Gridlayoutmanager,我目前正在使用GridLayoutManager进行RecyclerView,该视图显示不同文章的预览,这些文章具有不同的文本长度,因此具有不同的项目高度。问题是,我如何使用全高,并且没有太多的间距 使用StaggedGridLayoutManager! 尝试为recyclerview设置这样的布局管理器。 adapter = new CustomAdapter(R.layout.layout, list, context); final StaggeredGridLayoutManager l

我目前正在使用GridLayoutManager进行RecyclerView,该视图显示不同文章的预览,这些文章具有不同的文本长度,因此具有不同的项目高度。问题是,我如何使用全高,并且没有太多的间距


使用StaggedGridLayoutManager!

尝试为recyclerview设置这样的布局管理器。

adapter = new CustomAdapter(R.layout.layout, list, context);
final StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(numberOfrows, StaggeredGridLayoutManager.HORIZONTAL);
recyclerView_sk.setHasFixedSize(true);
recyclerView_sk.addItemDecoration(new SpacesItemDecorationNew(0));//For equal distribution of columns.
recyclerView_sk.setLayoutManager(layoutManager);
recyclerView_sk.setAdapter(adapter);
SpacesItemDecorationNew

public class SpacesItemDecorationNew extends RecyclerView.ItemDecoration {

    private int mItemOffset;

    public SpacesItemDecorationNew(int itemOffset) {
        mItemOffset = itemOffset;
    }

    public SpacesItemDecorationNew(@NonNull Context context, @DimenRes int itemOffsetId) {
        this(context.getResources().getDimensionPixelSize(itemOffsetId));
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
                               RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        outRect.set(mItemOffset, mItemOffset, mItemOffset, mItemOffset);
    }
}

你也可以试试这个

        mDashboardAdapter = new DashboardAdapter(getActivity(), mDashBoardList, imageId);
        RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 4);
        grid.setLayoutManager(mLayoutManager);
        grid.addItemDecoration(new GridSpacingItemDecoration(4, 10, true));
        grid.setItemAnimator(new DefaultItemAnimator());
        grid.setAdapter(mDashboardAdapter);



    public static class GridSpacingItemDecoration extends RecyclerView.ItemDecoration {

        private int spanCount;
        private int spacing;
        private boolean includeEdge;

        public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) {
            this.spanCount = spanCount;
            this.spacing = spacing;
            this.includeEdge = includeEdge;
        }

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

            if (includeEdge) {
                outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing)
                outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing)

                if (position < spanCount) { // top edge
                    outRect.top = spacing;
                }
                outRect.bottom = spacing; // item bottom
            } else {
                outRect.left = column * spacing / spanCount; // column * ((1f / spanCount) * spacing)
                outRect.right = spacing - (column + 1) * spacing / spanCount; // spacing - (column + 1) * ((1f /    spanCount) * spacing)
                if (position >= spanCount) {
                    outRect.top = spacing; // item top
                }
            }
        }
    }
mDashboardAdapter=新的仪表板适配器(getActivity(),mDashBoardList,imageId);
RecyclerView.LayoutManager mLayoutManager=新的GridLayoutManager(getActivity(),4);
grid.setLayoutManager(mLayoutManager);
grid.addItemDecoration(新的GridSpacingItemDecoration(4,10,true));
setItemAnimator(新的DefaultItemAnimator());
grid.setAdapter(mDashboardAdapter);
公共静态类GridSpacingItemDecoration扩展了RecyclerView.ItemDecoration{
私人帐户;
私有整数间隔;
私有布尔包含边;
公共网格间距gitemdecoration(整数跨距计数、整数间距、布尔includeEdge){
this.spanCount=spanCount;
这个。间距=间距;
this.includeEdge=includeEdge;
}
@凌驾
public void getItemOffsets(Rect outRect、View View、RecyclerView父级、RecyclerView.State){
int position=parent.getChildAdapterPosition(视图);//项目位置
int column=位置%spanCount;//项目列
如果(包括边缘){
outRect.left=间距-列*间距/spanCount;//间距-列*((1f/spanCount)*间距)
outRect.right=(列+1)*间距/spanCount;/(列+1)*((1f/spanCount)*间距)
如果(位置=spanCount){
outRect.top=间距;//项目顶部
}
}
}
}