Android5.0控件——RecyclerView的优缺点


以前面试的时候说自己做过什么巴拉巴拉的,然后提到了在创建列表视图的时候使用了recycleView,然后就是自己挖坑自己填被面试官问到recycleView的优缺点,因为当时就是看了看使用方法然后没有进行系统的套路概括,当时面试官的表情应该是觉得我回答的不够套路。。。好吧那就总结一下吧

RecyclerView是materials design中的组件之一,相应的还有CardView、Palette(Palette是一个可以从图片(Bitmap)中提取颜色的帮助类)等。按名字来说它主要的特点就是复用。我们知道,Listview中的Adapter中可以实现ViewHolder的复用RecyclerView提供了一个耦合度更低的方式来复用ViewHolder,并且可以轻松的实现ListView、GridView以及瀑布流的效果。

乍一看recycleView就是List的升级版本可以更加方便实现横纵列表,还有看起来比较灵性的瀑布流,它属于一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式。嗯...进入干货阶段
添加依赖

compile 'com.android.support:recyclerview-v7:24.2.1'

然后在XML文件的布局里面进行添加

<android.support.v7.widget.RecyclerView
        android:id="@+id/rlv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>

接下来就是三要素了
(1)、LayoutManager
(2)、RecyclerView.Adapter
(3)、ItemAnimator

LayoutManager:通过这位管理员可以将你的RecycleView设置成横向滑动的,纵向滑动的九宫格的还有瀑布流样式的

        //参数一:上下文参数二:定义了常量选择整体的方向参数三:Boolean值正序展示FALSE和反序展示TRUE
        //线性布局管理器,布局效果类似ListView
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        //九宫格布局,参数二:方向是纵向表示几列(参数三)横向表示几行
        RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this,2,GridLayoutManager.VERTICAL,false);
        //瀑布流布局,参数二:表示行列
        RecyclerView.LayoutManager layoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(layoutManager);

RecyclerView.Adapter这个适配器吧他自己封装好了一个低耦合的ViewHolder嗯就是这样的(很套路了)

        //2.设置数据适配器
        RecyclerView.Adapter adapter = new MyAdapter();
        recyclerView.setAdapter(adapter);

    class MyAdapter extends RecyclerView.Adapter<MyViewHolder>{
        //当没有可以复用的View时,调用该方法
        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = View.inflate(parent.getContext(),R.layout.recyler_item,null);
            MyViewHolder holder = new MyViewHolder(view);
            return holder;
        }
        //绑定数据到控件
        @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
            //设置图片背景
            holder.imgView.setBackgroundResource(iconsV[position]);
            //设置TextView
            holder.tv.setText("position "+position);
        }
        //条目的个数
        @Override
        public int getItemCount() {
            return iconsV.length;
        }
    }
    class MyViewHolder extends RecyclerView.ViewHolder{
        private final ImageView imgView;
        private final TextView tv;
        public MyViewHolder(View itemView) {
            super(itemView);
            imgView = (ImageView) itemView.findViewById(R.id.img);
            tv = (TextView) itemView.findViewById(R.id.tv);
        }
    }
    //理解RecyclerView.Adapter对比BaseAdapter的getView的实现
//    abstract  class ListViewBaseAdapter extends BaseAdapter{
//        @Override
//        public View getView(int position, View convertView, ViewGroup parent) {
//            ViewHolder holder;
//            if(convertView == null){
//                convertView = View.inflate(parent.getContext(),R.layout.item,null);
//                holder.tv = ;
//                holder.iv = ;
//            }else{
//                holder = convertView.getTag();
//            }
//            //设置数据
//            holder.tv.setText();
//            return null;
//        }
//    }
}

ItemAnimator老实说我没用过这个效果所以就百度一下吧
简单来说是会根据适配器上收到的相关通知去动画的显示组件的修改,添加和删除等。它会自动添加和移除item的动画。自带的默认效果也不错,已经非常好了。

然后进入正经总结
优点:

RecyclerView本身它是不关心视图相关的问题的,由于ListView的紧耦合的问题,google的改进就是RecyclerView本身不参与任何视图相关的问题。它不关心如何将子View放在合适的位置,也不关心如何分割这些子View,更不关心每个子View各自的外观。更进一步来说就是RecyclerView它只负责回收和重用的工作,这也是它名字的由来。

所有关于布局、绘制和其他相关的问题,也就是跟数据展示相关的所有问题,都被委派给了一些”插件化”的类来处理。这使得RecyclerView的API变得非常灵活。你需要一个新的布局么?接入另一个LayoutManager就可以了!你想要不同的动画么?接入一个新的ItemAnimator就可以了,诸如此类等等。

缺点:

在RecyclerView中,没有一个onItemClickListener方法。所以目前在适配器中处理这样的事件比较好。如果想要从适配器上添加或移除条目,需要明确通知适配器。这与先前的notifyDataSetChanged()方法稍微有些不同。具体操作在适配器代码中就可以体现。

整体总结它的几点如下:

Adapter:包装数据集合并且为每个条目创建视图。

ViewHolder:保存用于显示每个数据条目的子View。

LayoutManager:将每个条目的视图放置于适当的位置。

ItemDecoration:在每个条目的视图的周围或上面绘制一些装饰视图。

ItemAnimator:在条目被添加、移除或者重排序时添加动画效果。(这段是抄的懒得写了嘿嘿)
补充一个当recycleView嵌套发生滑动冲突的解决方法
把子布局的recycleView使用RelativeLayout布局包裹然后设置RelativeLayout的
descendantFocusability属性

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:descendantFocusability="blocksDescendants">

                <android.support.v7.widget.RecyclerView
                    android:id="@+id/rlv_conversion"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView>
            </RelativeLayout>

大概这个样子,然后接着补充一下descendantFocusability属相的三种设置
属性的值有三种:

beforeDescendants:viewgroup会优先其子类控件而获取到焦点

afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点

blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
在item的根布局中加入android:descendantFocusability=”blockDescendants”属性即可以解决子控件抢占父控件的焦点问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 【Android 控件 RecyclerView】 概述 RecyclerView是什么 从Android 5.0...
    Rtia阅读 307,350评论 27 439
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,439评论 25 707
  • 简介: 提供一个让有限的窗口变成一个大数据集的灵活视图。 术语表: Adapter:RecyclerView的子类...
    酷泡泡阅读 5,137评论 0 16
  • 黄昏、 雨停,曰赴,虹出。 我背对着窗口吹着冷风, 手里拿着你生前的书信, 一遍一遍… 人们常说:“算了吧,算了吧...
    侠名故客阅读 299评论 1 12
  • #01# 王小星站在李响单位门口,无聊地磕了磕后脚跟,最近的气温忽冷忽热,一阵风出来让她觉得自己今天的羽绒服真是没...
    郑小黑阅读 487评论 5 4