Android玩 --- Material Design(1) --- Recycleview的装饰(2)
来源:互联网 发布:中国药科大学网络教育 编辑:程序博客网 时间:2024/05/29 04:54
上一篇我们认识了Recycelview,并且能够简单的使用它,这一次我们来点酷炫的东西。
一.侧边栏ScollBars
为了实现侧边滑动的ScollBars,我们只需要在xml里添加一行代码
//当然还有横向的,根据自身需求选择android:scrollbars="vertical
这样我们就可以看到带有Scollbars的列表了,这个还是很简单的。
二.Item分割线
个人认为不加分割线比较好看,但是有时候我们的需求就是要有分割线,这个分割线实现的方式有很多种,不管是文艺型,大神型,2B青年型等等等等,反正我们能实现就OK。
1.第一种实现方式
这应该是属于一种文艺型的方式,那就是设置margin
margin大家都知道就是间距,当我们给Recycleview设置背景后,我们可以给item设置一个Margin,这样我们就能很明显的看出分割线了。 比较快捷,没什么技术含量,而且这个背景可以随心定制,所以你的分割线也会随着变化。
2.第二种实现方式
view。典型的2B青年欢乐多,我经常使用这种方法,哈哈。
在item的底部用< view >绘制一条横线,也非常简单呐,同样也可以自己定制颜色
3.第三种实现方式
我们的专业的方法来了,ItemDecoration,系统提供的当然是好东西,我们直接使用就好啦
//直接为recycleview添加ItemDecoration,传入上下文和方向值recyclerView.addItemDecoration(new DividerItemDecoration(RecycleviewActivity.this,DividerItemDecoration.VERTICAL));
预览在这里。
当然我们也可以通过Style来设置分割线
<item name = "android:listDivider">这里写你的背景颜色或者shape或者其他样式</item>
你可以设置一个渐变的shape添加给他。
三.Item ripple
Material Design为我们带来的Ripple效果很不错,我们可以选择用在点击上面,
其实说起来也不难,只在item的布局上添加一行代码(如果不是button的话还要实现它的监听器,才能看到ripple效果)
android:foreground="?android:attr/selectableItemBackground"
设置layout的前景色就可以实现ripple水波纹,不过需要注意的是,只能在Android5.0以上看到效果,如果要向下兼容的话不如试试Github的Ripple库,这种库也有好多,我就不一一列举了。
四.Item 添加删除动画
实际应用中,我们的List当然不能是写死的,我们会经常收到数据或者删除数据,Recycleview也为我们准备了添加删除数据的一些东西,我们一起来看一下。
我们在Adapter里添加addData()与removeData()方法,然后我们可以在有新数据或者要删除数据的时候调用
//addData方法,首先添加数据到list,然后通知适配器更新 public void addData(int position){ mStrings.add(position,"ADD"+position); notifyItemInserted(position); }//removeData方法,首先删除数据,然后通知适配器更新 public void removeData(int position){ mStrings.remove(position); notifyItemRemoved(position); }
我们在Toolbar上写点按钮来测试一下。
//在Activity里这样调用 //添加 adapter.addData(1); //删除 adapter.removeData(1);
最后,说好的动画在这里
//使用setItemAnimator方法来设置动画,你可以自定义你的动画啦,我这里使用的是默认动画recyclerView.setItemAnimator(new DefaultItemAnimator());
我会在后续的文章中介绍具体的动画
2017年6月25日15:33:41更新
最近些写项目用Recycleview遇到了不少坑,还好我从坑里爬了出来。
主要是对于数据item的局部更新,我们有些时候需要对某一项的数据进行更新,我们经常使用notifyDataSetChanged()进行刷新,比如下面,我在今天更改了部分代码,创建了Student类来演示,我修改了button的点击事件,点击后更新本项数据,并且更新
holder.mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //获取点击位置 int position = holder.getAdapterPosition(); Toast.makeText(mContext,"点击了"+mStudents.get(position).getName(),Toast.LENGTH_SHORT).show(); mStudents.get(position).setName("我是更新的数据"); notifyDataSetChanged(); } });
这里还有更标准的写法,就是更新单项,而不是更新全部
mStudents.get(position).setName("我是更新的数据"); notifyItemChanged(position);
五.下拉刷新
下拉刷新在移动设备上很常见,各种APP都带有刷新功能,也有各种酷炫的刷新方式,为此Google也推出了自己的下拉刷新控件—–SwipeRefreshLayout,这个控件可以和Listview,Recycleview等配合使用
我们修改一下我们的布局代码,在Recycleview外面加一层SwipeRefreshLayout
<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefreshLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/rec_main" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_alignParentStart="true"/> </android.support.v4.widget.SwipeRefreshLayout>
然后在Activity里写它的逻辑
//Find到控件后写刷新的事件。//在这里我模仿了一个加载的延时 new Handler().postDelayed(new Runnable() { public void run() { adapter.addData(1); //显示或隐藏刷新进度条 mSwipeRefreshLayout.setRefreshing(false); } }, 1000);
效果
这只是一个简单的刷新实例,SwipeRefreshLayout还有好多值得探索的地方,具体将在后来的MD专题列举
六.上拉加载
平时我们阅读新闻的时候,都是习惯向下滑,滑动越多看的越多,所以说下拉加载也是个很重要的功能。
我们可以使用ScollListener实现上拉加载
这里我们给recycleview添加OnScrollListener监听
recyclerView.addOnScrollListener(new OnScrollListener() { //标记当前是否时向最后一项滑动 boolean isLast = false; //滚动状态改变时 @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); //获取到当前的layoutmanager LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); if(newState == SCROLL_STATE_IDLE){ //得到管理器里面的最后一个item int Last = layoutManager.findLastVisibleItemPosition(); //得到管理器全部的item int total = layoutManager.getItemCount(); //判断当前是不是滑动,是否到了最下面的item地方,如果全是就加载 if(Last == total-1&&isLast){ //开始上拉加载 adapter.addData(total); } } } //滚动结束后 @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); //如果dy大于0,则说明在向下滑 if(dy>0){ isLast = true; }else{ isLast =false; } } });
这样我们就实现了上拉加载,不过一般的上拉加载都会有人性化处理的,在这里暂且不介绍。
七.本篇总结
在本篇文章中,我们认进一步装饰了Recycleview,让他具有了一个实际生产环境中列表应该具备的特性,不过这都是很简单的特性,后续文章将会实现一些酷炫的效果
八.相关及预告
Android玩 — Material Design(1) — Recycleview侧滑移位(3)
侧滑删除,移动换位。
九.纠错及更新日志
无
十.资源地址
https://github.com/Surine/RecycleviewDemo
十一.参考
敏敏啊呀的简书:
http://www.jianshu.com/p/c35ca003654d?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=qq
- Android玩 --- Material Design(1) --- Recycleview的装饰(2)
- Android玩 --- Material Design(1) --- Recycleview基本使用(1)
- material design(三)recycleview的ItemTouchHelper
- material design(二)RecycleView的使用详解
- android Material Design之 ToolBar+TabLayout+recycleView的效果实现
- android 新版的设计规范(Material Design)
- Android: Material Design 简单介绍(2)
- Android: Material Design 简单介绍(1)
- 在PyQt5里面玩Android 的Material Design风格
- Android Material Design(MD)
- Android material design(上)
- Android material design(下)
- Android Material Design Icon (material design 的图标 android studio )插件安装
- 玩转Android Material Design包
- Android Material Design(1) RecyclerView 的使用
- Android 自定义View(三)Material Design风格的ProgressBar
- Android的UI优化--Material Design之ToolBar(2017.06)
- RecycleView的使用--material design风格 列表显示
- Matlab函数meshgrid的作用
- 如何在app中打开支付宝进行打赏开发者
- 【怎样写代码】小技巧 -- 关于引用类型的两种转换方式
- 设计模式之观察者模式
- Android 基础篇(三)细节
- Android玩 --- Material Design(1) --- Recycleview的装饰(2)
- C++高精度算法之比大小
- eclipse安装hibernate插件
- 【Quartz】 JobListener、Triggerlistener、SchedulerListener介绍与使用
- 一些建站过程的图片
- [YTU]_1055 (输入字符串以及输出)
- 算法 排序算法之时间复杂度和空间复杂度
- G
- 接下来的安排+U3D界面初探