GVKun编程网logo

GridLayoutManager这么用,你可能还真没尝试过,kotlin开发android(gridlayout())

23

在本文中,我们将带你了解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())

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@

  1. 如果所处的RecyclerView子视图的位置处在标题的下方,那么就需要预留空间


    @H_301_5@ ,设置在outRect中,需要注意的是,同一行的多个子视图都需要预留空间。@H_301_5@

  2. 对不同于上一个数据标题的当前数据进行标题的绘制。@H_301_5@

  3. 重复执行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

Android FlowLayout作为RecyclerView LayoutManager

我想用 Android芯片实现Tag Cloud.

但我认为最好的方法是使用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 Grid Layout Manager不在元素居中

尝试将您的项目视图包装在线性布局中,并在其中居中放置图像。那应该解决它。

Android RecyclerView CardView StaggedGridLayoutManager:独立列滚动

Android RecyclerView CardView StaggedGridLayoutManager:独立列滚动

我有“常规”执行 StaggedGridLayoutManager.是否可以实现独立列滚动?例如,用户将触摸并滚动右列,以便其他列不会移动?

更进一步:当滚动右列时,其他列也将同步滚动但速度较慢? (这与Expedia App中的内容类似).

谢谢,

解决方法

您是否有任何理由不只是将多个回收站与您的数据分布在一起?您可以使用OnScrollListener或自定义实现来获取您描述的视差.

Android Recyclerview GridLayoutManager 列间距

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开发androidgridlayout()的分享已经结束,谢谢您的关注,如果想了解更多关于Android FlowLayout作为RecyclerView LayoutManager、Android Grid Layout Manager不在元素居中、Android RecyclerView CardView StaggedGridLayoutManager:独立列滚动、Android Recyclerview GridLayoutManager 列间距的相关知识,请在本站进行查询。

本文标签: