Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么我的RecyclerView项目之间的空间不一样?_Android_Android Recyclerview - Fatal编程技术网

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

Android 为什么我的RecyclerView项目之间的空间不一样?,android,android-recyclerview,Android,Android Recyclerview,我使用设置网格RecyclerView项之间的空间,我希望每个项之间的空间相等 项目装饰 public class SpaceItemDecoration extends RecyclerView.ItemDecoration { private int space; public SpaceItemDecoration(int space) { this.space = space; } @Override public void getItemOffsets(Rect outRec

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

项目装饰

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;
    }
}
公共类SpaceItemDecoration扩展了RecyclerView.ItemDecoration{
私有int空间;
公共空间项目装饰(内部空间){
这个空间=空间;
}
@凌驾
public void getItemOffsets(Rect outRect、View View、RecyclerView父级、RecyclerView.State){
if(GridLayoutManager的parent.getLayoutManager()实例){
GridLayoutManager.LayoutParams LayoutParams=(GridLayoutManager.LayoutParams)视图。getLayoutParams();
GridLayoutManager GridLayoutManager=(GridLayoutManager)parent.getLayoutManager();
int spanSize=layoutParams.getSpanSize();
int spanIndex=layoutParams.getSpanIndex();
int totalSpanSize=gridLayoutManager.getSpanCount();
如果(spanIndex==0){//左
outRect.left=空间;
outRect.right=空格/2;
}如果(spanSize+spanIndex==totalSpanSize){//right
outRect.right=空间;
outRect.left=空格/2;
}否则如果(spanIndex>0&&spanSize+spanIndex
回收视图

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

项目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>

试试这个

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();
}
GridSpacingItem装饰:

/* 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
            }
        }
    }
}
/*设置栅格视图的间距*/
公共类GridSpacingItemDecoration扩展了RecyclerView.ItemDecoration
{
最终专用int跨距、间距、间距和顶部;
最终私有布尔includeEdge;
公共网格间距gitemdecoration(整数跨度计数、整数间距左、整数间距上)
{
this.spanCount=spanCount;
this.spating=左间隔_;
this.includeEdge=true;
这是。间距\顶部=间距\顶部;
}
@凌驾
public void getItemOffsets(Rect outRect、View View、RecyclerView父级、RecyclerView.State)
{
int position=parent.getChildAdapterPosition(视图);//项目阶段\u位置
int column=位置%spanCount;//项目列
如果(包括边缘)
{
outRect.left=间距-列*间距/spanCount;//间距-列*((1f/spanCount)*间距)
outRect.right=(列+1)*间距/spanCount;/(列+1)*((1f/spanCount)*间距)
如果(位置=spanCount)
{
outRect.top=间距_top;//项目顶部
}
}
}
}

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

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

使用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);
    }
}
来自您的
活动

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);

    ............
    ......................
}

不需要这样分配空间,因为gridView本身管理其列之间的空间。他们说的不是gridView,而是具有网格布局的回收器视图。非常不同。这是针对gridView的,而不是具有网格布局的回收器视图。如果我的方向发生变化,我必须增加跨度计数,该怎么办?