上一篇我们认识了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