RecyclerView的divider的问题
来源:互联网 发布:解放军报网络投稿方式 编辑:程序博客网 时间:2024/05/17 18:14
recyclerview的divider的和listview不一样,也有官方的提供的API进行设置divider,代码如下:
LinearLayoutManager manager = new LinearLayoutManager(this); view.setLayoutManager(manager); DividerItemDecoration divider=new DividerItemDecoration(this,manager.getOrientation()); view.addItemDecoration(divider); MyAdapter adapter = new MyAdapter(); view.setAdapter(adapter);
下面是效果图
如果换成gridview的样式呢?,下图是gridview的样式,但是这种效果貌似不相符啊
关键部分来了,下面是gridview的间隔线代码;
//初始化view GridLayoutManager manager = new GridLayoutManager(this,3); recyView.setLayoutManager(manager); GridItemDecoration itemDecration = new GridItemDecoration(this); recyView.addItemDecoration(itemDecration); MyAdapter adapter = new MyAdapter(); recyView.setAdapter(adapter); /** * 自定义分割线 */ public class GridItemDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; private int[] attrs = new int[]{ android.R.attr.listDivider }; GridItemDecoration(Context context) { TypedArray typedArray = context.obtainStyledAttributes(attrs); mDivider = typedArray.getDrawable(0); typedArray.recycle(); } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { drawVertical(c, parent); drawHorizontal(c, parent); } private void drawHorizontal(Canvas c, RecyclerView parent) { // 绘制水平间隔线 int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int left = child.getLeft() - params.leftMargin; int right = child.getRight() + params.rightMargin; int top = child.getBottom() + params.bottomMargin; int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } private void drawVertical(Canvas c, RecyclerView parent) { //绘制垂直间隔线(垂直的矩形) int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int left = child.getRight() + params.rightMargin; int right = left + mDivider.getIntrinsicWidth(); int top = child.getTop() - params.topMargin; int bottom = child.getBottom() + params.bottomMargin; mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } @Override @Deprecated public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { // 四个方向的偏移值 int right = mDivider.getIntrinsicWidth(); int bottom = mDivider.getIntrinsicHeight(); if (isLastColum(itemPosition, parent)) {//是否是最后一列// outRect.set(0, 0, 0, bottom); right = 0; } if (isLastRow(itemPosition, parent)) {//是最后一行// outRect.set(0, 0, right, 0); bottom = 0; } outRect.set(0, 0, right, bottom); } /** * 是否是最后一行 * */ private boolean isLastRow(int itemPosition, RecyclerView parent) { int spanCount = getSpanCount(parent); RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); //有多少列 if (layoutManager instanceof GridLayoutManager) { int childCount = parent.getAdapter().getItemCount(); int lastRowCount = childCount % spanCount; //最后一行的数量小于spanCount if (lastRowCount == 0 || lastRowCount < spanCount) { return true; } } return false; } /** * 判断是否是最后一列 * */ private boolean isLastColum(int itemPosition, RecyclerView parent) { RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); //有多少列 if (layoutManager instanceof GridLayoutManager) { int spanCount = getSpanCount(parent); if ((itemPosition + 1) % spanCount == 0) { return true; } } return false; } private int getSpanCount(RecyclerView parent) { RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { GridLayoutManager lm = (GridLayoutManager) layoutManager; return lm.getSpanCount(); } return 0; } }
注意:recyview的item一定要保持一样的宽高,divider会出现错乱和衔接对不上的情况。
阅读全文
0 0
- RecyclerView的divider的问题
- RecyclerView 的分割线(divider)--DividerItemDecoration
- tabWidget的divider属性
- LinearLayout的Divider属性
- listview的divider边距
- listview的divider边距
- ListView的divider
- ListView的divider设置
- 解决listview的属性divider设置无效的问题
- Android List divider显示不出来的问题
- RecyclerView以及设置divider
- RecyclerView Divider完美解决方案
- Linearlayout的android:divider属性
- RecyclerView缓存的问题
- recyclerview出现的问题
- RecyclerView遇到的问题
- Recyclerview+glide的问题
- RecyclerView设置divider分割线
- gocron
- git的使用和总结
- 竞赛入门经典 3-4竖式
- 监控利器 --- Zabbix的常规监控配置
- vpn
- RecyclerView的divider的问题
- 我的第一个 PHP
- ztree插件的使用及事例
- caffe 的命令行训练与测试
- js操作dom对象
- Math类中提供了三个与取整有关的方法
- Kettle 7.1 share.xml中文乱码解决
- 【洛谷】团队·长郡中学初中信息组管理条例
- Python排序函数sort()和sorted()详解