为什么我的RecyclerView项目之间的空间不一样?

问题描述 投票:1回答:4

我使用ItemDecoration来设置网格RecyclerView项之间的空间,我希望每个项之间的空间相等。

enter image description here ItemDecoration

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) {
    if (parent.getLayoutManager() instanceof GridLayoutManager) {
        GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams) view.getLayoutParams();
        GridLayoutManager gridLayoutManager = (GridLayoutManager) parent.getLayoutManager();
        int spanSize = layoutParams.getSpanSize();
        int spanIndex = layoutParams.getSpanIndex();
        int totalSpanSize = gridLayoutManager.getSpanCount();
        if (spanIndex == 0) {//left
            outRect.left = space;
            outRect.right = space / 2;
        } else if (spanSize + spanIndex == totalSpanSize) {//right
            outRect.right = space;
            outRect.left = space / 2;
        } else if (spanIndex > 0 && spanSize + spanIndex < totalSpanSize) {
            outRect.left = space / 2;
            outRect.right = space / 2;
        }
        outRect.bottom = space;
    }
}

RecyclerView

    <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"/>

item xml

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="90dp"
android:layout_height="90dp"
android:background="#ff6600"
android:orientation="vertical">

</LinearLayout>
android android-recyclerview
4个回答
0
投票

试试这个,

int spanCount;
final private Context mContext =YourActivity.this;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_login);
    recycler_view=(RecyclerView)findViewById(R.id.recycler_view);

    recycler_view.setLayoutManager(new GridLayoutManager(mContext, 2));
    if (value == Configuration.ORIENTATION_PORTRAIT) {
        spanCount = 2;
    }
    else if (value == Configuration.ORIENTATION_LANDSCAPE) {
        spanCount = 3;
    }
    int spacing_left = 50; // 50px
    int spacing_top=10;

    recycler_view.addItemDecoration(new GridSpacingItemDecoration(spanCount, spacing_left, spacing_top));
}

@Override
protected void onResume() {

    value = activity.getResources().getConfiguration().orientation;

    if (value == Configuration.ORIENTATION_PORTRAIT) {
        spanCount = 2;
    }
    else if (value == Configuration.ORIENTATION_LANDSCAPE) {
        spanCount = 3;
    }

    super.onResume();
}

GridSpacingItemDecoration:

/* set spacing for grid view */
public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration
{
    final private int spanCount,spacing,spacing_top;
    final private boolean includeEdge;

    public GridSpacingItemDecoration(int spanCount, int spacing_left, int spacing_top)
    {
        this.spanCount = spanCount;
        this.spacing = spacing_left;
        this.includeEdge = true;
        this.spacing_top=spacing_top;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
    {
        int position = parent.getChildAdapterPosition(view); // item phases_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_top;
            }
            outRect.bottom = spacing_top; // 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_top; // item top
            }
        }
    }
}

0
投票

你为什么不尝试删除自定义间距的代码,并使用网格参数android:horizo​​ntalSpacing和android:verticalSpacing?


0
投票

在你的项目xml中添加android:scaleType="fitXY",它将使用FILL缩放图像,以便所有项目占用相同的区域。


0
投票

使用GridItemDecoration:

import android.content.Context;
import android.graphics.Rect;
import android.support.annotation.DimenRes;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;

public class GridItemDecoration extends RecyclerView.ItemDecoration {

    private int mItemOffset;

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

    public GridItemDecoration(@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);
    }
}

从你的Activity

RecyclerView mRecyclerView;
RecyclerView.LayoutManager mLayoutManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ................
    ........................

    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);

    mRecyclerView.setHasFixedSize(true);

    // Grid layout manager
    mLayoutManager = new GridLayoutManager(mContext, 3); // spanCount = 3 for 3 columns
    mRecyclerView.setLayoutManager(mLayoutManager);

    // Grid item spacing
    GridItemDecoration itemDecoration = new GridItemDecoration(mContext, R.dimen.grid_item_spacing); // R.dimen.grid_item_spacing is 2dp
    mRecyclerView.addItemDecoration(itemDecoration);

    ............
    ......................
}
© www.soinside.com 2019 - 2024. All rights reserved.