RecyclerView线性分割线

由于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线性分割线的更多相关文章
- 自定义RecyclerView.ItemDecoration,实现RecyclerView的分割线效果
[转] 原文 自定义RecyclerView.ItemDecoration,实现RecyclerView的分割线效果 字数1598 阅读302 评论2 喜欢23 1.背景 RecyclerView ...
- 实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性、网格、瀑布流效果演示
实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性.网格.瀑布流效果演示 效果预览 实例APP 小米应用商店 使用方法 build.gradle文件 dependenc ...
- RecyclerView 添加自定义分割线
默认的浅灰色的分割线在某些时候并不能满足我们的要求,这时就需要自定义分割线了. 我们可以通过两种方式来实现:调用 DividerItemDecoration.setDrawable 方法或者继承实现 ...
- RecyclerView添加分割线
mRecyclerView = findView(R.id.id_recyclerview); //设置布局管理器 mRecyclerView.setLayoutManager(layout); // ...
- Android零基础入门第65节:RecyclerView分割线开发技巧
在上一期通过简单学习,已经领略到了RecyclerView的灵活性,当然都是一些最基础的用法,那么本期一起来学习RecyclerView的分割线使用. 相信有的比较细心的同学已经发现了,使用Recyc ...
- Android RecyclerView(瀑布流)水平/垂直方向分割线
Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...
- Android 5.X新特性之RecyclerView基本解析及无限复用
说到RecyclerView,相信大家都不陌生,它是我们经典级ListView的升级版,升级后的RecyclerView展现了极大的灵活性.同时内部直接封装了ViewHolder,不用我们自己定义Vi ...
- Android开发之漫漫长途 XIV——RecyclerView
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- 安卓高级3 RecyclerView 和cardView使用案例
cardView: 添加依赖:在Studio搜索cardview即可 在V7包中 或者直接在gradle中添加 compile 'com.android.support:cardview-v7:24. ...
随机推荐
- Thinkphp5使用阿里大于短信验证
现在各种平台登录验证很多时候会使用短信验证,快捷安全,有很多平台提供短信验证服务,相比较而言阿里大于价格比较便宜,快捷,所以在在千锋日常的php教学中多以此为例来说明短信验证的使用.下面我们在tp5中 ...
- OVS + kernel datapath 的安装
***kernel datapath的OVS编译安装 下载源代码 $ git clone https://github.com/openvswitch/ovs.git 准备工具:生成configure ...
- java 1.8 动态代理源码分析
JDK8动态代理源码分析 动态代理的基本使用就不详细介绍了: 例子: class proxyed implements pro{ @Override public void text() { Syst ...
- MySQL优化之表结构优化的5大建议(数据类型选择讲的很好)
殊不知,在N年前被奉为"圣经"的数据库设计3范式早就已经不完全适用了.这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用. 由于MySQL数据库是基于行(Ro ...
- (转)对Http协议的长连接和短连接新的认识
转载来自:http://www.cnblogs.com/zuoxiaolong/p/life49.html一直对长连接短连接模模糊糊,看着该博主的文章,豁然开朗~ 引言 最近刚到公司不到一个月,正处于 ...
- nginx是什么nginx安装与配置之windows版
1.nginx是什么 为了快速了解nginx我们先引用网上的nginx介绍: Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP ...
- JAVA反射原理
什么是反射? 反射,一种计算机处理方式.是程序可以访问.检测和修改它本身状态或行为的一种能力.java反射使得我们可以在程序运行时动态加载一个类,动态获取类的基本信息和定义的方法,构造函数,域等.除了 ...
- VMware-VCSA-6.5安装过程
1.新建虚拟机 2.选择从OVF或OVA文件导入 3.给虚拟机命名,并选择OVF文件. 4.选择虚拟机的存储位置.这里没有配置共享存储宿,这里选择的宿主机的存储. 5.许可协议同意就OK了. 6.部署 ...
- 正则表达式去除字符串左右空格函数 调用方法是,str.Trim();
正则表达式去除字符串左右空格函数 调用方法是,str.Trim(); String.prototype.Trim = function() { return this.replace(/(^\s*)| ...
- (cljs/run-at (JSVM. :all) "一起实现柯里化")
前言 习惯了Ramda.js就会潜意识地认为函数均已柯里化,然后就可以随心所欲的用函数生成函数,或者使用compose组合多个函数来生成一个新函数.如下 const f = a => b =& ...