zoukankan      html  css  js  c++  java
  • Android新组件RecyclerView介绍,其效率更好


    今天我们首先来说为什么要介绍这个新组件RecyclerView,由于前几天我公布了一个经常使用面试题ListView的复用及怎样优化的文章,介绍给一些开发人员。可是我看到有关的反馈说:如今都不再用listview了。取代的是RecyclerView,确实是,可是用的毕竟是少数,所以可能非常多人对于这个组件不是非常了解,那么我们就来介绍一下吧!

    1、什么是RecyclerView

    RecyclerView 是 android-support-v7-21 版本号中新增的一个 Widgets,官方对于它的介绍则是:RecyclerView 是 ListView 的升级版本号,更加先进和灵活。

    简单来说就是:RecyclerView是一种新的视图组,目标是为不论什么基于适配器的视图提供相似的渲染方式。

    它被作为ListView和GridView控件的继承者,在最新的support-V7版本号中提供支持。

    2、用RecyclerView注意哪些方面,怎么用

    尽管RecyclerView充分考虑了它的扩展性。更好用,更灵活。可是用起来也有些麻烦。

    所以要使用RecyclerView。要好好考虑下面几点:

    (1)、RecyclerView.Adapter

    (2)、LayoutManager

    (3)、ItemAnimator

    第一点:RecyclerView.Adapter

    RecyclerView.Adapter包括了一种新型适配器,事实上与曾经我们使用的适配器基本类似,仅仅是略微有所不同。比方viewholder它帮我们封装好了,不用像曾经使用listview的适配器一样自己去写viewholder了。所以它的性能比曾经应该好了不少。废话不多说了,适配器样例例如以下:

    package com.pandastudios.pandastudios.adapter;

    import android.support.v7.widget.RecyclerView;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;

    import com.pandastudios.pandastudios.R;

    import java.util.List;

    /**
    * Created by loonggg on 15/7/18.
    */
    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private List<String> list;

    /**
    * 这里和使用listview时使用的adapter基本一样。都是要传入数据集合的
    *
    *
    @param list
    */
    public MyAdapter(List<String> list) {
    this.list = list;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = View.inflate(viewGroup.getContext(), R.layout.rv_item, null);
    ViewHolder holder = new ViewHolder(view);
    return holder;
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int i) {
    viewHolder.tv.setText(list.get(i));
    }

    @Override
    public int getItemCount() {
    return list.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
    public TextView tv;

    public ViewHolder(View itemView) {
    super(itemView);
    tv = (TextView) itemView.findViewById(R.id.item_tv);
    }
    }

    public void add(String item, int position) {
    list.add(position, item);
    notifyItemInserted(position);
    }

    public void remove(String item) {
    int position = list.indexOf(item);
    list.remove(position);
    notifyItemRemoved(position);
    }
    }

    第二点:LayoutManager

    这个LayoutManager类决定视图被放在画面中哪个位置,但这仅仅是它的众多职责之中的一个。它能够管理滚动和循环利用。

    LayoutManager仅仅有一个叫做LinearLayoutManager的实现类,我们能够设置它的横向和纵向。

    第三点:ItemAnimator

    ItemAnimator简单来说是会依据适配器上收到的相关通知去动画的显示组件的改动,加入和删除等。

    它会自己主动加入和移除item的动画。自带的默认效果也不错,已经很好了。

    3、RecyclerView长处和缺点

    长处:

    RecyclerView本身它是不关心视图相关的问题的,因为ListView的紧耦合的问题。google的改进就是RecyclerView本身不參与不论什么视图相关的问题。它不关心怎样将子View放在合适的位置,也不关心怎样切割这些子View,更不关心每一个子View各自的外观。更进一步来说就是RecyclerView它仅仅负责回收和重用的工作,这也是它名字的由来。

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

    缺点:

    在RecyclerView中。没有一个onItemClickListener方法。

    所以眼下在适配器中处理这种事件比較好。假设想要从适配器上加入或移除条目,须要明白通知适配器。

    这与先前的notifyDataSetChanged()方法略微有些不同。详细操作在适配器代码中就能够体现。


    总体总结它的几点例如以下:

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

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

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

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

    ItemAnimator:在条目被加入、移除或者重排序时加入动画效果。


    另:转发此文章到朋友圈。发送分享截图,索要源代码。


    个人组织了一个高端Android微信交流群。有意向的能够先分享此文章到朋友圈,再加我微信,发送分享到朋友圈的截图给我,我把你拉进去。

    保你学到很多其它知识,能够第一时间收到干货推送。


    微信号:smart_android (←长按复制)

    介绍:非著名程序猿,字耿左直右。号涩郎,爱搞机。爱编程,是爬行在移动互联网中的一名码匠!

    个人微信号:loonggg

    微博:涩郎

    QQ群:413589216 很多其它资料和源代码尽在QQ群文件

    今日头条:搜索“非著名程序猿”订阅很多其它信息

    工作:专注于移动互联网的开发和研究,本号致力于分享IT技术和程序员工作心得体会。

    欢迎大家关注与转载。


  • 相关阅读:
    android SQLiteDatabase数据库使用的时候 常见问题
    ArrayList与LinkedList的基本添加删除方法 模拟栈 队列
    ImageView小技巧
    TextView 小技巧
    悬浮窗
    帧动画布局文件 animation-list
    VideoView的全屏问题
    FragmentPagerAdapter与FragmentStatePagerAdapter区别
    观察者模式 DataObserver
    vue中filter的用法
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5303385.html
Copyright © 2011-2022 走看看