记录了下RecyclerView的使用方法,并且讲述了线性布局列表的使用方法,在此基础上加上了万能分割线,支持颜色分割线和图片分割线,同时支持对分割线设置线宽。

这篇是总结一下网格布局的使用,同样也支持两种分割线和线宽的设置。

主要的相关类:

1. RecyclerView.Adapter

2. GridLayoutManager 网格布局管理器

3. RecycleView.ItemDecoration 分割线

下面就直接通过一个例子来展示:

先上效果图:

(1) 颜色分割线

看起来还不错吧,根据item的数量去显示格子,当然如果你需要的样式不是三列,这个很简单,只需要在设置

GridLayoutManager的时候设置相应的列数即可,即:

mManagerLayout = new GridLayoutManager(getActivity(), 3);

(2) 图片分割线

可能有人会说你的列表四周都有分割线,其实在不做特殊处理时左边和上面默认是没有分割线的。后面我会加上四周没有分割线的,其实这两种形式在实际开发中都是常见的,先来看四周都有边线的。

由于RecycleView是高度解耦的控件,绘制分割线只和 RecycleView.ItemDecoration 有关,所以我们只需关心怎么去继承 RecycleView.ItemDecoration 去实现我们所需的分割线,如下:

这里需要说明的是:颜色分割线和图片分割线原理是完全一样的,图片分割线只是将一张很细的图片传入即可。

public class GridDivider extends RecyclerView.ItemDecoration {

private Drawable mDividerDarwable;

private int mDividerHight = 1;

private Paint mColorPaint;

public final int[] ATRRS = new int[]{android.R.attr.listDivider};

public GridDivider(Context context) {

final TypedArray ta = context.obtainStyledAttributes(ATRRS);

this.mDividerDarwable = ta.getDrawable(0);

ta.recycle();

}

/*

int dividerHight 分割线的线宽

int dividerColor 分割线的颜色

*/

public GridDivider(Context context, int dividerHight, int dividerColor) {

this(context);

mDividerHight = dividerHight;

//绘制颜色分割线的画笔

mColorPaint = new Paint();

mColorPaint.setColor(dividerColor);

}

/*

int dividerHight 分割线的线宽

Drawable dividerDrawable 图片分割线

*/

public GridDivider(Context context, int dividerHight, Drawable dividerDrawable) {

this(context);

mDividerHight = dividerHight;

mDividerDarwable = dividerDrawable;

}

@Override

public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {

super.onDraw(c, parent, state);

//画水平和垂直分割线

drawHorizontalDivider(c, parent);

drawVerticalDivider(c, parent);

}

public void drawVerticalDivider(Canvas c, RecyclerView parent) {

// 这里传入的parent是recycleview,通过它我们可以获取列表的所有的元素,

// 这里我们遍历列表中的每一个元素,对每一个元素绘制垂直分割线

final int childCount = parent.getChildCount();

for (int i = 0; i < childCount; i++) {

final View child = parent.getChildAt(i);

//获取当前item布局参数,通过它可以知道该item的精确位置,我们通过这个位置去绘制它的分割线

final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

final int top = child.getTop() - params.topMargin;

final int bottom = child.getBottom() + params.bottomMargin;

int left = 0;

int right = 0;

//左边第一列,

if ((i % 3) == 0) {

//item左边分割线

left = child.getLeft();

right = left + mDividerHight;

mDividerDarwable.setBounds(left, top, right, bottom);

mDividerDarwable.draw(c);

if (mColorPaint != null) {//如果是颜色分割线

c.drawRect(left, top, right, bottom, mColorPaint);

}

//item右边分割线

left = child.getRight() + params.rightMargin - mDividerHight;

right = left + mDividerHight;

} else {

//非左边第一列

left = child.getRight() + params.rightMargin - mDividerHight;

right = left + mDividerHight;

}

//画分割线

mDividerDarwable.setBounds(left, top, right, bottom);

mDividerDarwable.draw(c);

if (mColorPaint != null) {

c.drawRect(left, top, right, bottom, mColorPaint);

}

}

}

//....水平分割线与垂直分割线类似,完整代码见下。

}

下面是完整代码:

1. MainActivity

public class MainActivity extends AppCompatActivity {

private GridFragment mGridFragment;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//网格

mGridFragment = new GridFragment();

getFragmentManager().beginTransaction().replace(R.id.activity_main, mGridFragment).commit();

}

activity_main

android:id="@+id/activity_main"

android:layout_width="match_parent"

android:layout_height="match_parent">

2. GridFragment

public class GridFragment extends Fragment implements View.OnClickListener{

private RecyclerView mRecycleViewDrawable;

private RecyclerView mRecycleViewColor;

private LinearLayoutManager mManagerColor;

private LinearLayoutManager mManagerDrawable;

private List mData;

private Button mDrawable;

private Button mColor;

private MyRecycleViewAdapter mRecycleViewAdapter;

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment_grid_layout, container, false);

mRecycleViewDrawable = (RecyclerView) view.findViewById(R.id.recycleview_drawable);

mRecycleViewColor = (RecyclerView) view.findViewById(R.id.recycleview_color);

mDrawable = (Button) view.findViewById(R.id.btn_drawable);

mDrawable.setOnClickListener(this);

mColor = (Button) view.findViewById(R.id.btn_color);

mColor.setOnClickListener(this);

//设置颜色分割线

mManagerColor = new GridLayoutManager(getActivity(), 3);

mRecycleViewColor.setLayoutManager(mManagerColor);

mRecycleViewColor.addItemDecoration(new GridDivider(getActivity(), 20, this.getResources().getColor(R.color.colorAccent)));

//设置图片分割线

mManagerDrawable = new GridLayoutManager(getActivity(), 3);

mRecycleViewDrawable.setLayoutManager(mManagerDrawable);

Drawable drawable = ContextCompat.getDrawable(getActivity(), R.mipmap.divider);

mRecycleViewDrawable.addItemDecoration(new GridDivider(getActivity(), 20, drawable));

//初始化数据

mData = new ArrayList();

initData(mData);

mRecycleViewAdapter = new MyRecycleViewAdapter(getActivity(), R.layout.item_grid_recycleview, mData);

mRecycleViewColor.setAdapter(mRecycleViewAdapter);

mRecycleViewDrawable.setAdapter(mRecycleViewAdapter);

return view;

}

private void initData(List dataList) {

for (int i = 0; i < 16; i++) {

dataList.add("item" + i);

}

}

@Override

public void onClick(View view) {

int id = view.getId();

switch (id){

case R.id.btn_drawable:

mRecycleViewColor.setVisibility(View.INVISIBLE);

mRecycleViewDrawable.setVisibility(View.VISIBLE);

break;

case R.id.btn_color:

mRecycleViewColor.setVisibility(View.VISIBLE);

mRecycleViewDrawable.setVisibility(View.INVISIBLE);

break;

}

}

}

3.分割线 GridDivider

直接继承 RecyclerView.ItemDecoration

public class GridDivider extends RecyclerView.ItemDecoration {

private Drawable mDividerDarwable;

private int mDividerHight = 1;

private Paint mColorPaint;

public final int[] ATRRS = new int[]{android.R.attr.listDivider};

public GridDivider(Context context) {

final TypedArray ta = context.obtainStyledAttributes(ATRRS);

this.mDividerDarwable = ta.getDrawable(0);

ta.recycle();

}

/*

int dividerHight 分割线的线宽

int dividerColor 分割线的颜色

*/

public GridDivider(Context context, int dividerHight, int dividerColor) {

this(context);

mDividerHight = dividerHight;

mColorPaint = new Paint();

mColorPaint.setColor(dividerColor);

}

/*

int dividerHight 分割线的线宽

Drawable dividerDrawable 图片分割线

*/

public GridDivider(Context context, int dividerHight, Drawable dividerDrawable) {

this(context);

mDividerHight = dividerHight;

mDividerDarwable = dividerDrawable;

}

@Override

public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {

super.onDraw(c, parent, state);

//画水平和垂直分割线

drawHorizontalDivider(c, parent);

drawVerticalDivider(c, parent);

}

public void drawVerticalDivider(Canvas c, RecyclerView parent) {

final int childCount = parent.getChildCount();

for (int i = 0; i < childCount; i++) {

final View child = parent.getChildAt(i);

final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

final int top = child.getTop() - params.topMargin;

final int bottom = child.getBottom() + params.bottomMargin;

int left = 0;

int right = 0;

//左边第一列

if ((i % 3) == 0) {

//item左边分割线

left = child.getLeft();

right = left + mDividerHight;

mDividerDarwable.setBounds(left, top, right, bottom);

mDividerDarwable.draw(c);

if (mColorPaint != null) {

c.drawRect(left, top, right, bottom, mColorPaint);

}

//item右边分割线

left = child.getRight() + params.rightMargin - mDividerHight;

right = left + mDividerHight;

} else {

//非左边第一列

left = child.getRight() + params.rightMargin - mDividerHight;

right = left + mDividerHight;

}

//画分割线

mDividerDarwable.setBounds(left, top, right, bottom);

mDividerDarwable.draw(c);

if (mColorPaint != null) {

c.drawRect(left, top, right, bottom, mColorPaint);

}

}

}

public void drawHorizontalDivider(Canvas c, RecyclerView parent) {

final int childCount = parent.getChildCount();

for (int i = 0; i < childCount; i++) {

final View child = parent.getChildAt(i);

RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

final int left = child.getLeft() - params.leftMargin - mDividerHight;

final int right = child.getRight() + params.rightMargin;

int top = 0;

int bottom = 0;

// 最上面一行

if ((i / 3) == 0) {

//当前item最上面的分割线

top = child.getTop();

//当前item下面的分割线

bottom = top + mDividerHight;

mDividerDarwable.setBounds(left, top, right, bottom);

mDividerDarwable.draw(c);

if (mColorPaint != null) {

c.drawRect(left, top, right, bottom, mColorPaint);

}

top = child.getBottom() + params.bottomMargin;

bottom = top + mDividerHight;

} else {

top = child.getBottom() + params.bottomMargin;

bottom = top + mDividerHight;

}

//画分割线

mDividerDarwable.setBounds(left, top, right, bottom);

mDividerDarwable.draw(c);

if (mColorPaint != null) {

c.drawRect(left, top, right, bottom, mColorPaint);

}

}

}

}

4. Adapter

public class MyRecycleViewAdapter extends RecyclerView.Adapter {

private LayoutInflater mLayoutInflater;

private List mDataList;

private int mItemLayout;

public MyRecycleViewAdapter(Context context, int itemLayout, List datalist) {

mLayoutInflater = LayoutInflater.from(context);

mItemLayout = itemLayout;

mDataList = datalist;

}

@Override

public MyRecycleViewAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

return new MyViewHolder(mLayoutInflater.inflate(mItemLayout, parent, false));

}

@Override

public void onBindViewHolder(MyRecycleViewAdapter.MyViewHolder holder, int position) {

holder.mTextView.setText(mDataList.get(position));

}

@Override

public int getItemCount() {

return mDataList.size();

}

class MyViewHolder extends RecyclerView.ViewHolder {

private TextView mTextView;

public MyViewHolder(View itemView) {

super(itemView);

mTextView = (TextView) itemView.findViewById(R.id.tv);

}

}

}

adapter 的item布局

android:layout_width="match_parent"

android:layout_height="wrap_content">

android:id="@+id/tv"

android:gravity="center"

android:layout_width="match_parent"

android:layout_height="60dp"/>

未完待续……

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android 分割线布局,Android RecyclerView网格布局(支持多种分割线)详解(2)相关推荐

  1. android网格布局间隙,RecyclerView网格布局瀑布流布局设置间距

    RecyclerView在网格布局或者瀑布流布局下,如果要设置间距,可以使用ItemDecoration. 下面的代码是设置显示两列数据RecyclerView的情况. cat.png @Overri ...

  2. android网格布局间距,Android布局之GridLayout网格布局

    网格布局标签是GridLayout.这个布局是android4.0新增的布局.这个布局只有4.0之后的版本才能使用. 不过新增了一些东东 ①跟LinearLayout(线性布局)一样,他可以设置容器中 ...

  3. Android基础入门教程——2.3.1 TextView(文本框)详解

    Android基础入门教程--2.3.1 TextView(文本框)详解 标签(空格分隔): Android基础入门教程 本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解And ...

  4. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  5. android相册和拍照并裁剪图片大小,Android 拍照并对照片进行裁剪和压缩实例详解...

    Android 拍照并对照片进行裁剪和压缩实例详解 本文主要介绍 Android 调用摄像头拍照并对照片进行裁剪和压缩,文中给出了主要步骤和关键代码. 调用摄像头拍照,对拍摄照片进行裁剪,代码如下. ...

  6. android自定义圆角进度条,Android自定义进度条的圆角横向进度条实例详解

    1.本文将向你介绍自定义进度条的写法,比较简单,但还是有些知识点是需要注意的: invalidate()方法 RectF方法的应用 onMeasure方法的应用 2.原理 画3层圆角矩形,底层为黑色, ...

  7. Android studio 多渠道(多环境)打包grade配置详解

    Android studio 多渠道(多环境)打包grade配置详解 场景:开发app,我们需要两套环境或者两套环境以上的apk,每套环境的apk分两个版本debug版和release版. 公司有套平 ...

  8. php中的文字排版问题,CSS布局中常用的文字排版相关属性详解

    本篇文章给大家带来的内容是关于CSS布局中常用的文字排版相关属性详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. CSS布局中常用的文字排版相关属性详解 一.设定文字字体.颜色.大 ...

  9. Android Studio CPU profiler性能分析工具介绍和使用详解

    Android Studio CPU profiler性能分析工具介绍和使用详解 CPU profiler介绍 Android Studio CPU 性能剖析器可实时检查应用的 CPU 使用率和线程活 ...

  10. Android Studio打不开虚拟机,两种情况详解

    Android Studio打不开虚拟机,两种情况详解 文章目录 Android Studio打不开虚拟机,两种情况详解 1.VT-x is disabled in BIOS 2.Emulator文件 ...

最新文章

  1. list转map stream_advancedday10可变参数不可变集合及Stream流
  2. hadoop 全分布式部署
  3. 3399 mysql_MySQL索引
  4. mysql基础语法(常用)
  5. Akka之actor模型
  6. java 解锁关闭文件占用_程序员:Java文件锁定、解锁和其它NIO操作
  7. Proteus:51仿真入门
  8. php yii 微信支付宝,Yii使用easywechat实现微信支付
  9. 用计算机术语形容人性格的词语,电脑桌创意广告词——关于电脑桌的广告语
  10. 不拆微动,一招解决鼠标双击问题
  11. 【推荐系统论文精读系列】(十二)--Neural Factorization Machines for Sparse Predictive Analytics
  12. 股票涨跌的心理学原理: 过度自信理论
  13. 二维占用栅格地图Occupancy grid maps
  14. 360极速浏览器,关闭“开启DirectWrite高清字体渲染支持”导致内置打印崩溃
  15. Win8或Win8.1下输入法小技巧,个人习惯,可参考
  16. 数据备份:备份文件/文件夹怎么操作?
  17. The Things Network LoRaWAN Stack V3 学习笔记 2.5 LoRa节点配置接入
  18. 特别篇之(标准编码)
  19. 信息安全专家李钊博士:信息物理系统安全措施
  20. [ 渗透入门篇 ] 从渗透测试执行标准着手的渗透学习大纲。掌握了这些知识点还担心找不到工作?

热门文章

  1. git 怎么导入本地仓库_将本地文件夹添加到Git仓库
  2. uni-app — 一套前端开发跨平台应用的终极解决方案
  3. 即时通讯源码,社交软件开发
  4. 计算机网络-网络层详细讲解
  5. 【Python实战】高校数据采集,爬虫训练场项目数据储备
  6. 一文带你深入理解probe函数
  7. 诊断分析-2-滚动轴承故障诊断
  8. Linux系列—策略路由、ip rule、ip route
  9. Android中实现类似qq好友列表展开收起的效果
  10. 【技术贴】如何删除卡巴斯基的日志?占C盘了好多空间....