在本文中,我们将带你了解GridLayoutManager这么用,你可能还真没尝试过,kotlin开发android在这篇文章中,我们将为您详细介绍GridLayoutManager这么用,你可能还真
在本文中,我们将带你了解GridLayoutManager这么用,你可能还真没尝试过,kotlin开发android在这篇文章中,我们将为您详细介绍GridLayoutManager这么用,你可能还真没尝试过,kotlin开发android的方方面面,并解答gridlayout()常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的Android FlowLayout作为RecyclerView LayoutManager、Android Grid Layout Manager不在元素居中、Android RecyclerView CardView StaggedGridLayoutManager:独立列滚动、Android Recyclerview GridLayoutManager 列间距。
本文目录一览:- GridLayoutManager这么用,你可能还真没尝试过,kotlin开发android(gridlayout())
- Android FlowLayout作为RecyclerView LayoutManager
- Android Grid Layout Manager不在元素居中
- Android RecyclerView CardView StaggedGridLayoutManager:独立列滚动
- Android Recyclerview GridLayoutManager 列间距
GridLayoutManager这么用,你可能还真没尝试过,kotlin开发android(gridlayout())
private Boolean isDrawTitleBg = false;@H_301_5@
private Context mContext;@H_301_5@
// 总的SpanSize@H_301_5@
private int totalSpanSize;@H_301_5@
private int mCurrentSpanSize;@H_301_5@
//… 省略一些方法@H_301_5@
@Override@H_301_5@
public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {@H_301_5@
super.onDraw(c, parent, state);@H_301_5@
// 绘制标题的逻辑:@H_301_5@
// 如果该行的数据的需要显示的标题不同于上行的标题,就绘制标题@H_301_5@
final int paddingLeft = parent.getPaddingLeft();@H_301_5@
final int paddingRight = parent.getPaddingRight();@H_301_5@
final int childCount = parent.getChildCount();@H_301_5@
for (int i = 0; i < childCount; i++) {@H_301_5@
View child = parent.getChildAt(i);@H_301_5@
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();@H_301_5@
int pos = params.getViewLayoutPosition();@H_301_5@
IGridItem item = gridItems.get(pos);@H_301_5@
if (item == null || !item.isShow())@H_301_5@
continue;@H_301_5@
if (i == 0) {@H_301_5@
drawTitle(c, paddingLeft, paddingRight, child@H_301_5@
, (RecyclerView.LayoutParams) child.getLayoutParams(), pos);@H_301_5@
} else {@H_301_5@
IGridItem lastItem = gridItems.get(pos - 1);@H_301_5@
if (lastItem != null && !item.getTag().equals(lastItem.getTag())) {@H_301_5@
drawTitle(c, paddingLeft, paddingRight, child,@H_301_5@
(RecyclerView.LayoutParams) child.getLayoutParams(), pos);@H_301_5@
}@H_301_5@
}@H_301_5@
}@H_301_5@
}@H_301_5@
/**@H_301_5@
* 绘制标题@H_301_5@
* @param canvas 画布@H_301_5@
* @param pl 左边距@H_301_5@
* @param pr 右边距@H_301_5@
* @param child 子View@H_301_5@
* @param params RecyclerView.LayoutParams@H_301_5@
* @param pos 位置@H_301_5@
*/@H_301_5@
private void drawTitle(Canvas canvas, int pl, int pr, View child, RecyclerView.LayoutParams params, int pos) {@H_301_5@
if (isDrawTitleBg) {@H_301_5@
mTitlePaint.setColor(mTitleBgColor);@H_301_5@
canvas.drawRect(pl, child.getTop() - params.topMargin - mTitleHeight, pl@H_301_5@
, child.getTop() - params.topMargin, mTitlePaint);@H_301_5@
}@H_301_5@
IGridItem item = gridItems.get(pos);@H_301_5@
String content = item.getTag();@H_301_5@
if (TextUtils.isEmpty(content))@H_301_5@
return;@H_301_5@
mTitlePaint.setColor(mTitleColor);@H_301_5@
mTitlePaint.setTextSize(mTitleFontSize);@H_301_5@
mTitlePaint.setTypeface(Typeface.DEFAULT_BOLD);@H_301_5@
mTitlePaint.getTextBounds(content, 0, content.length(), mRect);@H_301_5@
float x = UIUtils.dip2px(20f);@H_301_5@
float y = child.getTop() - params.topMargin - (mTitleHeight - mRect.height()) / 2;@H_301_5@
canvas.drawText(content, x, y, mTitlePaint);@H_301_5@
}@H_301_5@
@Override@H_301_5@
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {@H_301_5@
super.getItemOffsets(outRect, view, parent, state);@H_301_5@
// 预留逻辑:@H_301_5@
// 只要是标题下面的一行,无论这行几个,都要预留空间给标题显示@H_301_5@
int position = parent.getChildAdapterPosition(view);@H_301_5@
IGridItem item = gridItems.get(position);@H_301_5@
if (item == null || !item.isShow())@H_301_5@
return;@H_301_5@
if (position == 0) {@H_301_5@
outRect.set(0, mTitleHeight, 0, 0);@H_301_5@
mCurrentSpanSize = item.getSpanSize();@H_301_5@
} else {@H_301_5@
if (!offsetPositions.isEmpty() && offsetPositions.contains(position)) {@H_301_5@
outRect.set(0, mTitleHeight, 0, 0);@H_301_5@
return;@H_301_5@
}@H_301_5@
if (!TextUtils.isEmpty(item.getTag()) && !item.getTag().equals(gridItems.get(position - 1).getTag())) {@H_301_5@
mCurrentSpanSize = item.getSpanSize();@H_301_5@
} else@H_301_5@
mCurrentSpanSize += item.getSpanSize();@H_301_5@
if (mCurrentSpanSize <= totalSpanSize) {@H_301_5@
outRect.set(0, mTitleHeight, 0, 0);@H_301_5@
offsetPositions.add(position);@H_301_5@
}@H_301_5@
}@H_301_5@
}@H_301_5@
}@H_301_5@
总的逻辑就是:@H_301_5@
-
如果所处的RecyclerView子视图的位置处在标题的下方,那么就需要预留空间
@H_301_5@ ,设置在outRect中,需要注意的是,同一行的多个子视图都需要预留空间。@H_301_5@ -
对不同于上一个数据标题的当前数据进行标题的绘制。@H_301_5@
-
重复执行1、2。@H_301_5@
2. 界面部分
public class SpecialGridActivity extends AppCompatActivity {@H_301_5@
// GridItem实现了IGridItem接口@H_301_5@
private List values;@H_301_5@
private RecyclerView mRecyclerView;@H_301_5@
private GridItemdecoration itemdecoration;@H_301_5@
// 自己封装的RecyclerAdapter@H_301_5@
private RecyclerAdapter mAdapter;@H_301_5@
@Override@H_301_5@
protected void onCreate(Bundle savedInstanceState) {@H_301_5@
super.onCreate(savedInstanceState);@H_301_5@
setContentView(R.layout.activity_special_grid);@H_301_5@
initWidget();@H_301_5@
}@H_301_5@
private void initWidget() {@H_301_5@
mRecyclerView = findViewById(R.id.rv_content);@H_301_5@
// 创建GridLayoutManager,并设置SpanSizeLookup@H_301_5@
GridLayoutManager gll = new GridLayoutManager(this, 3);@H_301_5@
gll.setSpanSizeLookup(new SpecialSpanSizeLookup());@H_301_5@
mRecyclerView.setLayoutManager(gll);@H_301_5@
values = initData();@H_301_5@
// 自己封装的RecyclerAdapter@H_301_5@
mRecyclerView.setAdapter(mAdapter = new RecyclerAdapter(values,null) {@H_301_5@
@Override@H_301_5@
public ViewHolder onCreateViewHolder(View root, int viewType) {@H_301_5@
switch (viewType) {@H_301_5@
case R.layout.small_grid_recycle_item:@H_301_5@
return new SmallHolder(root);@H_301_5@
case R.layout.normal_grid_recycle_item:@H_301_5@
return new normalHolder(root);@H_301_5@
case R.layout.special_grid_recycle_item:@H_301_5@
return new SpecialHolder(root);@H_301_5@
default:@H_301_5@
return null;@H_301_5@
}@H_301_5@
}@H_301_5@
@Override@H_301_5@
public int getItemLayout(GridItem gridItem, int position) {@H_301_5@
switch (gridItem.getType()) {@H_301_5@
case GridItem.TYPE_SMALL:@H_301_5@
return R.layout.small_grid_recycle_item;@H_301_5@
case GridItem.TYPE_norMAL:@H_301_5@
return R.layout.normal_grid_recycle_item;@H_301_5@
case GridItem.TYPE_SPECIAL:@H_301_5@
return R.layout.special_grid_recycle_item;@H_301_5@
}@H_301_5@
return 0;@H_301_5@
}@H_301_5@
});@H_301_5@
//…@H_301_5@
// 分隔线生成@H_301_5@
// 之前的GridItemdecoration代码中我将构建者模式部分省略了@H_301_5@
itemdecoration = new GridItemdecoration.Builder(this,values, 3)@H_301_5@
.setTitleTextColor(Color.parseColor("#4e5864"))@H_301_5@
.setTitleFontSize(22)@H_301_5@
.setTitleHeight(52)@H_301_5@
.build();@H_301_5@
mRecyclerView.addItemdecoration(itemdecoration);@H_301_5@
}@H_301_5@
// 数据初始化@H_301_5@
private List initData() {@H_301_5@
List values = new ArrayList<>();@H_301_5@
values.add(new GridItem(“我很忙”, “”, R.drawable.head_1,“最近常听”,1,GridItem.TYPE_SMALL));@H_301_5@
values.add(new GridItem(“治愈:有些歌比闺蜜更懂你”, “”, R.drawable.head_2,“最近常听”,1,GridItem.TYPE_SMALL));@H_301_5@
values.add(new GridItem("「华语」90后的青春纪念手册", “”, R.drawable.head_3,“最近常听”,1,GridItem.TYPE_SMALL));@H_301_5@
values.add(new GridItem(“流行创作女神你霉,泰勒斯威夫特的创作历程”, “”, R.drawable.special_2@H_301_5@
,“更多为你推荐”,3,GridItem.TYPE_SPECIAL));@H_301_5@
values.add(new GridItem(“行走的CD写给别人的歌”, “给「跟我走吧」几分,试试这些”, R.drawable.normal_1@H_301_5@
,“更多为你推荐”,3,GridItem.TYPE_norMAL));@H_301_5@
values.add(new GridItem(“爱情里的酸甜苦辣,让人捉摸不透”, “听完「靠近一点点」,他们等你翻牌”, R.drawable.normal_2@H_301_5@
,“更多为你推荐”,3,GridItem.TYPE_norMAL));@H_301_5@
values.add(new GridItem(“关于喜欢你这件事,我都写在了歌里”, “「好想你」听罢,听它们吧”, R.drawable.normal_3@H_301_5@
,“更多为你推荐”,3,GridItem.TYPE_norMAL));@H_301_5@
values.add(new GridItem(“周杰伦暖心混剪,短短几分钟是多少人的青春”, “”, R.drawable.special_1@H_301_5@
,“更多为你推荐”,3,GridItem.TYPE_SPECIAL));@H_301_5@
values.add(new GridItem(“我好想和你一起听雨滴”, “给「发如雪」几分,那这些呢”, R.drawable.normal_4@H_301_5@
,“更多为你推荐”,3,GridItem.TYPE_norMAL));@H_301_5@
values.add(new GridItem(“油管周杰伦热门单曲Top20”, “「周杰伦」的这些哥,你听了吗”, R.drawable.normal_5@H_301_5@
,“更多为你推荐”,3,GridItem.TYPE_norMAL));@H_301_5@
return values;@H_301_5@
}@H_301_5@
class SpecialSpanSizeLookup extends GridLayoutManager.SpanSizeLookup {@H_301_5@
@Override@H_301_5@
public int getSpanSize(int i) {@H_301_5@
// 返回在数据中定义的SpanSize@H_301_5@
GridItem gridItem = values.get(i);@H_301_5@
return gridItem.getSpanSize();@H_301_5@
}@H_301_5@
}@H_301_5@
class SmallHolder extends RecyclerAdapter.ViewHolder {@H_301_5@
//… 代码省略,就是设置图片和文字的操作@H_301_5@
// 小的Holder@H_301_5@
}@H_301_5@
class normalHolder extends RecyclerAdapter.ViewHolder {@H_301_5@
//… 中等的Holder@H_301_5@
}@H_301_5@
class SpecialHolder extends RecyclerAdapter.ViewHolder {@H_301_5@
//… 横向大的Holder
SpanSize(int i) {@H_301_5@
// 返回在数据中定义的SpanSize@H_301_5@
GridItem gridItem = values.get(i);@H_301_5@
return gridItem.getSpanSize();@H_301_5@
}@H_301_5@
}@H_301_5@
class SmallHolder extends RecyclerAdapter.ViewHolder {@H_301_5@
//… 代码省略,就是设置图片和文字的操作@H_301_5@
// 小的Holder@H_301_5@
}@H_301_5@
class normalHolder extends RecyclerAdapter.ViewHolder {@H_301_5@
//… 中等的Holder@H_301_5@
}@H_301_5@
class SpecialHolder extends RecyclerAdapter.ViewHolder {@H_301_5@
//… 横向大的Holder@H_301_5@
Android FlowLayout作为RecyclerView LayoutManager
但我认为最好的方法是使用RecycleView和自定义LayoutManager.
我搜索一个LayoutManager,它将其子项布局为FlowLayout,但什么都没找到.
是否有人发现了这种行为或关于自定义布局管理器的简单教程?我发现没有简单或简单但不完整的文章.
.
解决方法
您已将此行添加到Gradle依赖项中:
compile 'com.xiaofeng.android:flowlayoutmanager:1.2.3.2'
并使用它设置您的Recycler视图布局管理器:
recyclerView.setLayoutManager(new FlowLayoutManager());
您有关于如何在Github上配置它的其他详细信息:https://github.com/xiaofeng-han/AndroidLibs/tree/master/flowlayoutmanager
Android Grid Layout Manager不在元素居中
尝试将您的项目视图包装在线性布局中,并在其中居中放置图像。那应该解决它。
Android RecyclerView CardView StaggedGridLayoutManager:独立列滚动
StaggedGridLayoutManager
.是否可以实现独立列滚动?例如,用户将触摸并滚动右列,以便其他列不会移动?
更进一步:当滚动右列时,其他列也将同步滚动但速度较慢? (这与Expedia App中的内容类似).
谢谢,
解决方法
Android Recyclerview GridLayoutManager 列间距
如何使用 GridLayoutManager 设置 RecyclerView 的列间距?在我的布局中设置边距/填充无效。
答案1
小编典典RecyclerViews
支持ItemDecoration的概念:特殊偏移和围绕每个元素绘制。如this
answer所示,您可以使用
public class SpacesItemDecoration extends RecyclerView.ItemDecoration { private int space; public SpacesItemDecoration(int space) { this.space = space; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { outRect.left = space; outRect.right = space; outRect.bottom = space; // Add top margin only for the first item to avoid double space between items if (parent.getChildLayoutPosition(view) == 0) { outRect.top = space; } else { outRect.top = 0; } }}
然后通过添加
mRecyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view);int spacingInPixels = getResources().getDimensionPixelSize(R.dimen.spacing);mRecyclerView.addItemDecoration(new SpacesItemDecoration(spacingInPixels));
今天的关于GridLayoutManager这么用,你可能还真没尝试过,kotlin开发android和gridlayout()的分享已经结束,谢谢您的关注,如果想了解更多关于Android FlowLayout作为RecyclerView LayoutManager、Android Grid Layout Manager不在元素居中、Android RecyclerView CardView StaggedGridLayoutManager:独立列滚动、Android Recyclerview GridLayoutManager 列间距的相关知识,请在本站进行查询。
本文标签: