个人知识总结:View篇--RecyclerView

A flexible view for providing a limited window into a large data set.

以上是Google api对于RecyclerView的介绍,RecyclerView用于为大型数据集提供有限的窗口,与ListView一样是一个列表类型的控件,不过RecyclerView比ListView更加灵活,RecyclerView不进可以在垂直方向显示列表,还可以在水平方向显示列表,亦可以像GridView一样显示网格列表。

RecyclerView的使用

RecyclerView和ListView的基本使用时一致的,都是需要一个数据源,一个列表样式适配器,不过相较于ListView,RecyclerView需要加入依赖,因为RecyclerView并不是原生的控件,而是放在support包里面的:

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

加入依赖包之后就可以在布局文件xml里面正常引用了:

<android.support.v7.widget.RecyclerView
        android:id="@+id/recycle_data"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/color_white"/>
RecyclerView的布局Manager

之前也有提到过,RecyclerView可以实现ListView一样的列表样式,也可以实现GridView一样的网格样式,更可以实现RecyclerView独有的瀑布流样式(当然自定义也可以实现瀑布流),都要归功于RecyclerView的LayoutManager:

  • LinerLayoutManager(线性):以垂直或者水平列表方式展示Item
  • GridLayoutManager (网格):以网格方式展示Item
  • StaggeredGridLayoutManager(瀑布流): 以瀑布流方式展示Item
    简单的使用方法如下所示:
//垂直方向的线性列表布局
        LinearLayoutManager verticalLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        //水平方向的线性列表布局
        LinearLayoutManager horizontalLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        //网格样式布局
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
        //瀑布流布局
        StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);

        recyclerView.setLayoutManager(verticalLayoutManager);

当然,每一个Manager的参数有什么含义,感兴趣的可以查看源码更深入的去了解,但是基本上重写RecyclerView去实现更加多样的效果的新控件,也基本上是不会动Manager的。

RecyclerView的适配器Adapter

之前有提到ListView的适配器Adapter的使用和相关的优化方式,而RecyclerView的Adapter都完美的继承并优化了ListView的适配器的优点。但是,RecyclerView的适配器还是有些地方没有实现,就是每一项的点击事件,按照Google官方给的答复是,使用者可以自定义点击事件,更加灵活方便,Adapter的简单使用如下:

public class RecyclerTestAdapter extends RecyclerView.Adapter<RecyclerTestAdapter.ViewHolder> {

    private List<String> dataList;
    private Context mContext;
    private OnTestAdapterClickListener mOnTestAdapterClickListener;

    public RecyclerTestAdapter(List<String> dataList, Context context) {
        this.dataList = dataList;
        mContext = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_recycler_view, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) {
        viewHolder.tvText.setText(dataList.get(i));
        viewHolder.llRoot.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnTestAdapterClickListener != null) {
                    mOnTestAdapterClickListener.onItemClick(i);
                }
            }
        });
        viewHolder.tvText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnTestAdapterClickListener != null) {
                    mOnTestAdapterClickListener.onTextClick(i);
                }
            }
        });
    }

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

    public void setOnTestAdapterClickListener(OnTestAdapterClickListener onTestAdapterClickListener) {
        mOnTestAdapterClickListener = onTestAdapterClickListener;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {

        LinearLayout llRoot;
        TextView tvText;
        
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            llRoot = itemView.findViewById(R.id.item_root);
            tvText = itemView.findViewById(R.id.tv_item_text);
        }
    }
    
    public interface OnTestAdapterClickListener{
        
        void onItemClick(int position);
        
        void onTextClick(int position);
    }
}

当然更复杂的使用,需要多重写一些adapter的其他方法,同一个列表根据下标,或者是其他的什么标识,根据情况来显示不同样式的布局,等等各种各样的深度使用,这都需要深入的去查看源码,研究学习使用。

RecyclerView的列表decoration和animator

RecyclerView的列表每一项的分割线显示和ListView的显示不一样,ListView的分隔符可以在xml属性里面设置,RecyclerView的分隔符使用的是单独的一个类ItemDecoration,这是一个抽象类,如果想要自定义每一项之间的分隔符,就需要继承ItemDecoration并重写相关方法,注入自己想要的分隔符的效果。并通过add方法,添加到想要该效果的RecyclerView上面去:

recyclerView.addItemDecoration(new TestItemDecoration());

RecyclerView的列表每一项滑出屏幕、滑出屏幕都可以自定义出独特的动画,可以用ItemAnimator这个抽象类,正常情况下,都是不设置,使用的是support包里面的默认动画DefaultItemAnimator类,也可以继承ItemAnimator类并重写相关方法,只需要通过set方法设置一下就可以了:

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

推荐阅读更多精彩内容

  • 感谢上帝,车刚刚发动,幸运的是我在车上了 现在还在喘气。。九点五十的汽车票,室友啊的一声说九点二十了,...
    宁古天空阅读 160评论 0 0
  • 整整一个月没有在简书上写东西了,开学前几天因为在看《平凡的世界》,整天一有空就沉浸书中无法自拔,九月份开学后,每...
    涵芷依阅读 222评论 0 0