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

阅读全文
0 0
原创粉丝点击