Android 为什么我的RecyclerView项目之间的空间不一样?
我使用设置网格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
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的,而不是具有网格布局的回收器视图。如果我的方向发生变化,我必须增加跨度计数,该怎么办?