Android玩 --- Material Design(1) --- Recycleview的装饰(2)

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值