由于recyclerview默认是没有分割线的,需要显示分割线的话,可以在布局里添加一条有背景色的View标签,或者通过ItemDecoration来实现,本文以后者为例。

ItemDecoration里有2个重要的方法,onDraw和getItemOffsets。

class MyItemDecoration extends RecyclerView.ItemDecoration {
private int mOrientation = LinearLayout.VERTICAL;
private Drawable mDivider; MyItemDecoration(Context context) {
int[] rids = new int[]{android.R.attr.listDivider};//系统自带的属性,宽高各2dp
TypedArray typedArray = context.obtainStyledAttributes(rids);
mDivider = typedArray.getDrawable(0);
typedArray.recycle();
} void setOrientation(int orientation) {
mOrientation = orientation;
} int getOrientation() {
return mOrientation;
} @Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
((LinearLayoutManager) parent.getLayoutManager()).setOrientation(mOrientation);
if (mDivider != null) {
//需要传入画布和当前recyclerview
if (mOrientation == LinearLayout.HORIZONTAL) {
drawHorizontal(c, parent);
} else {
drawVertical(c, parent);
}
}
} //绘制竖直方向的横线
private void drawVertical(Canvas c, RecyclerView parent) {
int left = parent.getPaddingLeft();//横线左右随父容器
int right = parent.getWidth() - parent.getPaddingRight();
for (int i = 0; i < parent.getChildCount(); i++) {
//遍历recyclerview的每个子view
View child = parent.getChildAt(i);
//分割线的top,left,right,bottom
int top = child.getBottom();
int bottom = child.getBottom() + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);//设置分割线的区域
mDivider.draw(c);//绘制到画布
}
} //绘制水平方向的竖线
private void drawHorizontal(Canvas c, RecyclerView parent) {
int top = parent.getPaddingTop();//竖线上下随父容器
int bottom = parent.getBottom();
for (int i = 0; i < parent.getChildCount(); i++) {
//遍历recyclerview的每个子view
View child = parent.getChildAt(i);
//分割线的top,left,right,bottom
int left = child.getRight();
Log.d("TAG", "LEFT:" + left);
int right = left + mDivider.getIntrinsicWidth();
mDivider.setBounds(left, top, right, bottom);//设置分割线的区域
mDivider.draw(c);//绘制到画布
}
} @Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State
state) {
super.getItemOffsets(outRect, view, parent, state);
//item之间的位移量
if (mOrientation == LinearLayout.HORIZONTAL) {
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
} else {
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
}
}
}

布局文件activity_main

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.jogger.animatorpathdemo.MainActivity"> <Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加"/> <Button
android:id="@+id/btn_reduce"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="移除"/> <Button
android:id="@+id/btn_change"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="切换orientation"/> <android.support.v7.widget.RecyclerView
android:id="@+id/rv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>

MainActivity

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private RecyclerView rv_content;
private MyAdapter mAdapter;
private Button btn_add;
private Button btn_reduce;
private Button btn_change;
private int mPos;
private MyItemDecoration mMyItemDecoration; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rv_content = (RecyclerView) findViewById(R.id.rv_content);
mAdapter = new MyAdapter(this);
rv_content.setLayoutManager(new LinearLayoutManager(this));
rv_content.setAdapter(mAdapter);
rv_content.setItemAnimator(new DefaultItemAnimator());//默认添加动画
mMyItemDecoration = new MyItemDecoration(this);
mMyItemDecoration.setOrientation(LinearLayout.HORIZONTAL);//设置方向
rv_content.addItemDecoration(mMyItemDecoration);
btn_add = (Button) findViewById(R.id.btn_add);
btn_reduce = (Button) findViewById(R.id.btn_reduce);
btn_change = (Button) findViewById(R.id.btn_change);
btn_add.setOnClickListener(this);
btn_reduce.setOnClickListener(this);
btn_change.setOnClickListener(this);
} @Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_add:
mAdapter.addItem(mPos);
mPos++;
if (mPos > 50) {
mPos = 50;
}
break;
case R.id.btn_reduce:
mPos--;
if (mPos < 0) {
mPos = 0;
}
mAdapter.removeItem(mPos);
break;
case R.id.btn_change:
if (mMyItemDecoration.getOrientation() == LinearLayout.HORIZONTAL) {
mMyItemDecoration.setOrientation(LinearLayout.VERTICAL);//设置方向
} else {
mMyItemDecoration.setOrientation(LinearLayout.HORIZONTAL);//设置方向
}
rv_content.addItemDecoration(mMyItemDecoration);
break;
}
}
}

适配器MyAdapter

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private Context mContext;
private List<String> mList; public MyAdapter(Context context) {
mContext = context;
mList = new ArrayList<>();
} public void addItem(int pos) {
mList.add(pos, "android--->" + pos);
notifyItemInserted(pos);
} public void removeItem(int pos) {
mList.remove(pos);
notifyItemChanged(pos);
} @Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new MyViewHolder(LayoutInflater.from(mContext).inflate(R.layout.rv_item, parent,
false));
} @Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tv_content.setText(mList.get(position));
} @Override
public int getItemCount() {
return mList.size();
} class MyViewHolder extends RecyclerView.ViewHolder {
TextView tv_content; MyViewHolder(View itemView) {
super(itemView);
tv_content = (TextView) itemView.findViewById(R.id.tv_content);
}
}
}

RecyclerView线性分割线的更多相关文章

  1. 自定义RecyclerView.ItemDecoration,实现RecyclerView的分割线效果

    [转] 原文 自定义RecyclerView.ItemDecoration,实现RecyclerView的分割线效果 字数1598 阅读302 评论2 喜欢23 1.背景   RecyclerView ...

  2. 实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性、网格、瀑布流效果演示

    实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性.网格.瀑布流效果演示 效果预览 实例APP 小米应用商店 使用方法 build.gradle文件 dependenc ...

  3. RecyclerView 添加自定义分割线

    默认的浅灰色的分割线在某些时候并不能满足我们的要求,这时就需要自定义分割线了. 我们可以通过两种方式来实现:调用 DividerItemDecoration.setDrawable 方法或者继承实现 ...

  4. RecyclerView添加分割线

    mRecyclerView = findView(R.id.id_recyclerview); //设置布局管理器 mRecyclerView.setLayoutManager(layout); // ...

  5. Android零基础入门第65节:RecyclerView分割线开发技巧

    在上一期通过简单学习,已经领略到了RecyclerView的灵活性,当然都是一些最基础的用法,那么本期一起来学习RecyclerView的分割线使用. 相信有的比较细心的同学已经发现了,使用Recyc ...

  6. Android RecyclerView(瀑布流)水平/垂直方向分割线

     Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...

  7. Android 5.X新特性之RecyclerView基本解析及无限复用

    说到RecyclerView,相信大家都不陌生,它是我们经典级ListView的升级版,升级后的RecyclerView展现了极大的灵活性.同时内部直接封装了ViewHolder,不用我们自己定义Vi ...

  8. Android开发之漫漫长途 XIV——RecyclerView

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  9. 安卓高级3 RecyclerView 和cardView使用案例

    cardView: 添加依赖:在Studio搜索cardview即可 在V7包中 或者直接在gradle中添加 compile 'com.android.support:cardview-v7:24. ...

随机推荐

  1. Yii2.0中场景的使用小记

    熟悉Yii框架的人都知道,灵活的使用场景可以达到事半功倍的效果! 比如普通的数据的新增.修改,新增需要验证其中两个字段,而修改只需要验证其中一个字段:还有种情况,也是我们现在用到的,同一张表(同一个m ...

  2. MQL语句大全

    mysql sql语句大全 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql se ...

  3. java加密算法入门(一)-算法概念及单向加密

    说起加密,我的第一印象就是电视剧各种密码本破解解密的场景,这两天在看加密相关的东西,做下笔记以便以后查看,也提供给大家个参考. 本文是java加密的第一篇,主要讲述下消息编码Base64以及简单的消息 ...

  4. javascript常用开发笔记:一个简单强大的js日期格式化方法

    前言:一直没找到好用的javascript日期格式化工具,自己写了一个,方便以后复用 1.主要功能 (1)支持任意顺序的日期格式排列:yyyy=年,MM=月,dd=日,HH=时,mm=分,ss=秒,s ...

  5. python之路第一篇

    一.python环境的搭建 1.window下环境的搭建 (1).在 https://www.python.org/downloads/ 下载自己系统所需要的python版本 (2).安装python ...

  6. 说说ajax上传数据和接收数据

    我是一个脑袋不太灵光的人,所以遇到问题,厚着脸皮去请教大神的时候,害怕被大神鄙视,但是还是被鄙视了.我说自己不要点脸面,那是不可能的,但是,为了能让自己的技术生涯能走的更长远一些,受点白眼,受点嘲笑也 ...

  7. react-router 参数获取

    No BB!!! show me the code. Main.js import { BrowserRouter, Route, Link ,Switch} from 'react-router-d ...

  8. 关于MATLAB处理大数据坐标文件201763

    目前已经找出26条特征 ,但是提交数据越来越少,给我的感觉是随机森林画的范围越来越小,输出的机器数据也越来越少,我自认为特征没太大问题 我已经将不懂之处列了出来,将于明天咨询大师级人物

  9. BigDecimal四舍五入使用总结

    //BigDecimal四舍五入double f1 = new BigDecimal(1).setScale(2,RoundingMode.HALF_UP).doubleValue();//转化成字符 ...

  10. 【Android Developers Training】 87. 序言:同步到云

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...