RecycleView初尝试

最近上了Study Jams的课程,布置了一个小作业。为了完成小作业,自己就顺便尝试用了一下RecycleView。

从整体上看RecyclerView的架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人惊艳的效果。

  • 控制其排列显示的方式,通过布局管理器LayoutManager(抽象类,系统提供了3个实现类)
  • 控制Item间的间隔(可绘制),通过ItemDecoration(抽象类,需自己实现类)
  • 控制Item增删的动画,通过ItemAnimator(抽象类,系统提供了1个实现类)
  • 控制点击、长按事件,需要自己写
  • 自己实现RecycleView.Adapter<ViewHolder>

需要先添加依赖

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

1、LayoutManager

这是一个抽象类,好在系统提供了3个实现类:

  1. LinearLayoutManager 线性布局管理器,支持横向、纵向。
  2. GridLayoutManager 网格布局管理器,支持横向、纵向。
  3. StaggeredGridLayoutManager 瀑布就式布局管理器,支持横向、纵向。
        mRecyclerView.setHasFixedSize(true);//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);//可以设置滚动的方向,默认竖直滚动
        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.setAdapter(mAdapter);
        GridLayoutManager layoutManager =new GridLayoutManager(this,3);//3行
        layoutManager.setOrientation(OrientationHelper.HORIZONTAL);//水平
        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.setAdapter(mAdapter);
        StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL);//表示2列,并且是竖直方向的瀑布流
        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.setAdapter(mAdapter);

2、ItemDecoration

抽象类,需自己实现类

ItemDecoration的一个实现类例子

3、ItemAnimator

也是一个抽象类,好在系统为我们提供了一种默认的实现类DefaultItemAnimator()。

// 设置item动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());

更新数据集不是用adapter.notifyDataSetChanged()而是notifyItemInserted(position)notifyItemRemoved(position)

4、点击事件

你可以通过mRecyclerView.addOnItemTouchListener去监听然后去判断手势, 也可以通过adapter中自己去提供回调。

这里使用第二种,使用接口回调的方法。

在Adapter类中添加以下的接口:

    public interface OnRecyclerViewItemClickListener {
        void onItemClick(View view, int position);
        void onItemLongClick(View view, int position);
    }

    private OnRecyclerViewItemClickListener mOnItemClickListener = null;

    public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
        this.mOnItemClickListener = listener;
    }

在Adapter类中的onBindViewHolder()方法回调接口

        //点击事件回调
        if(mOnItemClickListener != null){
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mOnItemClickListener.onItemClick(holder.itemView,position);
                }
            });

            //longClick
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    mOnItemClickListener.onItemLongClick(holder.itemView,position);
                    return false;
                }
            });
        }

在需要实现RecycleView点击事件的类中实现接口

mAdapter.setOnItemClickListener(this);

5、RecycleView.Adapter<ViewHolder>

需要一个继承自RecyclerView.Adapter的适配器,作用是将数据与每一个item的界面进行绑定。主要实现三个方法:

  1. getItemCount 这个不用说,获取总的条目数
  2. onCreateViewHolder 创建ViewHolder
  3. onBindViewHolder 将数据绑定至ViewHolder

我们创建的ViewHolder必须继承RecyclerView.ViewHolder,这个RecyclerView.ViewHolder的构造时必须传入一个View,这个View相当于我们ListView getView中的convertView (即:我们需要inflate的item布局需要传入)。还有一点,ListView中convertView是复用的,在RecyclerView中,是把ViewHolder作为缓存的单位了,然后convertView作为ViewHolder的成员变量保持在ViewHolder中,也就是说,假设屏幕显示10个条目,则会创建10个ViewHolder缓存起来,每次复用的是ViewHolder,所以他把getView这个方法变为了onCreateViewHolder。

//自定义的ViewHolder,持有每个Item的的所有界面元素
class ViewHolder extends RecyclerView.ViewHolder {
    ImageView mAvatar;
    TextView mName;

    public ViewHolder(View view) {
        super(view);
        mAvatar = (ImageView) view.findViewById(R.id.img_avatar);
        mName = (TextView) view.findViewById(R.id.txt_name);
    }
}

例子源码

时间: 2024-08-30 03:25:32

RecycleView初尝试的相关文章

如何为编程爱好者设计一款好玩的智能硬件(五)——初尝试&#183;把温湿度给收集了(中)!

一.我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用.积木化.功能重组的智能硬件模块构想 二.别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计硬件积木的! 三.MCU选型:如何为编程爱好者设计一款好玩的智能硬件(三)——该选什么样的MCU呢? 四.温湿度传感器DHT11驱动封装(上):如何为编程爱好者设计一款好玩的智能硬件(四)——初尝试·把温湿度给收集了(上)! 五.温湿度传感器DHT11驱动封装(中): 先打个预防针——本篇可能比较枯燥!与上一篇

如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试&#183;把温湿度给收集了(下)!

一.我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用.积木化.功能重组的智能硬件模块构想 二.别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计硬件积木的! 三.MCU选型:如何为编程爱好者设计一款好玩的智能硬件(三)——该选什么样的MCU呢? 四.温湿度传感器DHT11驱动封装(上):如何为编程爱好者设计一款好玩的智能硬件(四)——初尝试·把温湿度给收集了(上)! 五.温湿度传感器DHT11驱动封装(中):如何为编程爱好者设计一款好玩的智能硬件(五)

R语言爬虫初尝试-基于RVEST包学习

R语言爬虫初尝试-基于RVEST包学习 Thursday, February 26, 2015 在学完coursera的getting and Cleaning data后,继续学习用R弄爬虫网络爬虫.主要用的还是Hadley Wickham开发的rvest包.再次给这位矜矜业业开发各种好用的R包的大神奉上膝盖 查阅资料如下: rvest的github rvest自身的帮助文档 rvest + CSS Selector 网页数据抓取的最佳选择-戴申: 里面有提及如何快速获得html的位置.看完这

block初尝试。

1, @class seatObject; typedef void (^touchButtom) (seatObject *); @interface seatObject : UIView<VShowRoomServiceDelegate> { } @property (nonatomic ,strong)touchButtom block; @end 2, @implementation seatObject @synthesize seatView,userNameLable,user

log_2020_0121: Markdown初尝试

目录 安装的插件其实在vsc初尝试都已经说得差不多了.接下来还是打算该用什么就去查. Ditta之类的东西暂时没用动力学--还是想学Tikz. 现在学会的有: 多级标题 使用#来控制,最多可以生成六级标题 生成索引 直接在想生成索引的区域键入``即可 引言块 在行前加> 行内代码与行间代码 行内使用反引号实现code 行间使用tab×1/space×4/三个反引号包裹 推荐三个反引号,在首行后加入语言种类设定之后,还可以实现代码高亮(注意前后空行): #include <stdio.h>

如何为编程爱好者设计一款好玩的智能硬件(四)——初尝试&#183;把温湿度给收集了(上)!

一.我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用.积木化.功能重组的智能硬件模块构想 二.别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计硬件积木的! 三.MCU选型:如何为编程爱好者设计一款好玩的智能硬件(三)——该选什么样的MCU呢? 四.温湿度传感器DHT11驱动封装: 万事开头难,昨晚睡太晚!每天一篇确实有点累,不过能鞭策自己不偷懒努力向前!前三篇我们已经大致将“X-积木”大大致轮廓(第一篇).同类产品(第二篇).MCU选型及大致计划(第

codefirst初尝试

Code First 约定 借助 CodeFirst,可通过使用 C# 或Visual Basic .NET 类来描述模型.模型的基本形状可通过约定来检测.约定是规则集,用于在使用 Code First 时基于类定义自动配置概念模型.约定是在 System.Data.Entity.ModelConfiguration.Conventions 命名空间中定义的. 可通过使用数据注释或Fluent API 进一步配置模型.优先级是通过 Fluent API 进行配置,然后是通过数据注释,再次是通过约

vuejs和webpack项目(VueComponent)初尝试——瀑布流组件

碎碎念:     好久不见,最近自己有些懈怠没更过多少博,主要原因之一是对自己学习方式的一些思考,翻看之前的博客多是记录学习笔记这反映出了自己对于前端还停留在学习-复习知识点的阶段压根没多少实践经验啊这让我有些惶恐,原因之二是前段时间接触并了解性地学习了amd,cmd模块,angular和vue,一些模板引擎,less预编译语言,以及开发相关的各种构建工具...讲真前端真的好杂,心有余而力不足有时就挺迷茫,所以这些仅仅只是接触是接触跟着官网了解学习并没有深入原理性的探索学习.曾经我在一开始就尝试

python初尝试,写一个简单的爬虫程序

1.首先因为mac自带python,版本为python2.7.10 2.安装pip,因为已经有了,所以不能用brew install.这里用sudo easy_install pip 3.安装beatifulsoup4,sudo -H pip install beautifulsoup4. BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式. 4.安装html5lib,sudo pip insta