美文网首页
Android:RecyclerView的使用(附菜单创建)

Android:RecyclerView的使用(附菜单创建)

作者: 千里同学 | 来源:发表于2018-06-18 10:16 被阅读0次

    在android应用中经常要看到一些列表式的东西,比如QQ、微信的消息列表,还有网格式及瀑布式的格局,这些东西让我们看起来相当的有规则,看起来算是比较美观的,今天我主要介绍RecyclerView的使用。

    RecyclerView这个控件引自v7包,在使用前切记要导包。

    RecyclerView说白了就是ListView的升级版,不过它只关注回收和复用,在ListView中有时候根据需要我们会自定义适配器adapter,自定义适配器就一定要复写getView()方法。这时就要暴露一个问题,单纯在这里面给那些控件设置属性就可以了吗?当然你可以这么做,但是你要考虑一个问题,如果你的信息量非常大,比如现在你的ListView中有1w、10w甚至更多的item你觉得你的应用会奔溃吗?— —我觉得应该是会的,并且是死于内存溢出。所以针对性能上的问题,我们通常会设置一个ViewHolder辅助类来作为item的缓存,这样就基本实现了内存的复用。

    RecyclerView与之不同,官方给它配置了一个专用的适配器RecyclerView.Adapter。该适配器的使用与之前我们自定义的略有区别,为了让ViewHolder得到更多的重视,以及性能方面的考虑,官方把这个适配器和ViewHolder绑定在一起。这次我们不再去创建getView(),而是将其功能一分为二,分别是onCreateViewHolder()和onBindViewHolder(),看名字就知道,前者是创建ViewHolder,后者是绑定,也就是设置一个ViewHolder给设置属性。

    废话不多说,接下来上干货:

    源码地址:https://github.com/QianLiStudent/MyStudyDemoRepository

    1. 首先是在布局文件设置一下RecyclerView这个控件,此处不赘述。

    2. (前面说RecyclerView是ListView的升级版)定义好数据源(通常用集合,可以动态添加、删除元素等)、适配器、初始化RecyclerView对象、给RecyclerView设置适配器。

    数据源的话大家就在创建适配器之前自己设置吧。

    3. RecyclerView是多变的,它可以变换成很多种类的格局,常见的有列表式、网格式、瀑布式等。接下来我们要做的就是设置布局管理器recyclerView.setLayoutManager(),其参数针对上面提到的有列表式:LinearLayoutManager(参数查看api文档),网格式:GridLayoutManager(参数查看api文档),瀑布式:StaggeredGridLayoutManager(参数查看api文档)。

    4. 第3步走完就可以显示了,这里是展示的是列表式,那么怎么让RecyclerView动态变换格局呢?看这里:

    这里我设置一个菜单,故这里采用switch做匹配,一开始我们设置布局管理器采用setLayoutManager(),变换其实就是setLayoutManager(格局1)→setLayoutManager(格局2),参数是布局管理器,详情查看api。

    5. 这样做出来之后你就可以运行了,但是总是觉得哪里不对劲???没错,他变成一整块面板了,对某些人来说(至少对我来说)很丑对吧?这好办,给它设置分隔线不就得了

    由于官方并没有提供分隔线相关的java类,故我们需要自己去写一个或者采用其他作者所写的,我们也可以考虑在res/values/styles.xml中自己定义,这里我觉得没什么必要,当然也是根据需要啦。不过啊,我觉得专门去做一个分隔线不管采用上面哪种方式都挺麻烦的,这里有一个十分方便的办法。首先你要知道,我们设置分隔线是给谁设置的?——没错,就是给item,为了让item与item之间有明显的边界,我们可以在设置布局文件的时候给最外层的控件(即XXXLayout)设置一个android:layout_margin="xxx",这里我把margin设置为全方位的外边距,显得四周都有分隔,当然可以根据自己需要来设定,这样我们也能做出分割线的效果,个人觉得还是挺美观的,而且使用也方便。

    6. 上面提到RecyclerView是ListView的升级版,自然它也和ListView一样是用来做内容容器的。我们不能要求用户只使用我们提供的固定数据,因此这里我们需要在adapter中写添加和删除的方法。

    这里我为了测试就直接把保存的数据写成“Insert here”,根据需要这里应该在add后面的参数增加一个要保存的数据,position参数表示你要添加的数据的位置,合法的位置是:     0~集合Object.size()(tip:这个合法位置是针对add方法的)。我们在添加集合元素前面设置position是为了让集合中的数据顺序和控件展示顺序一致。加进去之后我们要提醒adapter数据发生变化了,让它做数据更新,这时就要调用notifyItemInserted(position),对指定位置做局部刷新。注意,这里我们不能使用notifyDataSetChanged(),这么做会把所有的数据都刷新一遍,是会降低性能的。接下来是delete,其后面的参数也是指定要删除item的位置,合法的位置是:0~集合Object.size()— 1(tip:这个合法位置是针对delete方法的),然后调用notifyItemRemoved(position),这里也是局部刷新。在使用的时候有时候代码提示会出现notifyItemChanged(position),这个是改变,即如果你在add的时候使用这个方法进行刷新,那么在你指定位置的item会被你新添加进来的item给取代掉,也就是说集合数量增加了,但是你在适配器这里数量没有增加,只是把position的item给替换掉了内容。慎用  慎用  慎用~~

    7. RecyclerView这个控件啊,官方做的还是很贴心的,他给我们提供了RecyclerView中的默认动画类DefaultItemAnimator,使用如下:

    使用方式超级简单,至于动画类是怎么做的有兴趣的可以去研究,但是单纯使用的话就上面一句话就够了,是不是很贴心 ~ ,个人觉得这个效果还是很棒的,当然有很多大神自己写了动画,大家也可以去参考别人的或者考到本地引用,根据需要吧。

    8. 展示出来的信息本来就是给别人看的,显示在表面的毕竟内容有限,我们通常会在点击或者其他事件触发后进入到更深层看到item内部的具体内容,就点击而言,我们就要给item设置点击事件来监听和做事件处理,对吧。但是官方并没有给我们提供任何的类、接口啥的,故我们需要自己定义接口,这里这里:

    这里定义的回调方法是为了让适配器监听item点击系列事件,当该回调方法被调用的时候回传过来一个实例对象,下面通过判断是否为空来判断是否有调用该回调方法。也就是如果你不设置监听器,是没有办法触发监听事件的。

    此方法在onBindViewHolder中调用,在adapter中我们会多次使用到holder.itemView。这个其实是我们定义了ViewHolder类的子类,从父类那里继承过来的属性itemView,holder在这里可以理解为一条本缓冲过得item所代表的对象,holder.itemView才是一条真正的item,然后在Activity中的adapter给它设置监听器就可以做监听了。有读者会想到为什么这里监听到事件后不直接在这里做处理呢?干嘛还回调到别的地方去?是的,你的想法是没错的,但是我们要考虑一个问题,你在这边貌似什么都做不了,什么Toast,Dialog,Intent啥都做不了,就像有一个工作室B了解(理解为代码中的监听)到工作室A有一个项目要找人外包,但是由于某种原因自己做不了,故把这个机会推荐给工作室C让他们去做。

    这里提一下瀑布流高度是怎么实现的。

    瀑布流的格局我们看起来是高度不一的对吧。那其实就是一个随机数生成的高度,我们定义一个随机数,然后在onBindViewHolder中给设置一下高度就行了,代码如下:

    这个随机数集合我们可以放在构造方法中实现 这里参数命名都很明确,就不再赘述

    AS是默认没有给菜单的初始化和事件监听的方法了,因此我们需要自己去创建:onCreateOptionMenu()和onOptionItemSelected(),在这之前我们要在res下创建一个Menu的folder:右键res - New - Android Resources Directory - Resources Type - menu,建完folder之后在里面创建一个Menu Resources File,然后xml里面的内容就是一个一个的item

    android:showAsAction=“ifRoom”设置在标题栏处,若为“never”则作为隐藏列表菜单项

    然后是先前提到的两个方法:

    中间的内容根据需要自己补充吧。

    以上是关于RecyclerView基本使用的整体流程及menu的创建和引用。

    本文的学习内容学自鸿洋大神在慕课网的视频:

    https://www.imooc.com/learn/424

    相关文章

      网友评论

          本文标题:Android:RecyclerView的使用(附菜单创建)

          本文链接:https://www.haomeiwen.com/subject/kuwgeftx.html