当ListView遇上RecyclerView, ListView将甘拜下风

RecyclerView和ListView的区别 ListView和RecyclerView最大的区别在于数据源改变时的缓存的处理逻辑,ListView是"一锅端",将所有的mActiveViews都移入了二级缓存mScrapViews,而RecyclerView则是更加灵活地对每个View修改标志位,区分是否重新bindView。2). ListView缓存View。dispathLayoutStep3():计算布局前后各个ItemView的状态,如Remove,Add,Move,Update等,如有必要执行相应的动画. 阅读详情

通过本篇博客,你将学到以下知识点

①RecyclerView与ListView相比它的优点
②RecyclerView的初步用法
③RecyclerView的Adapter的用法
④给RecyclerView增加条目点击事件

1.RecyclerView是什么?

  RecylerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字recylerview即回收view也可以看出。看到这也许有人会问,不是已经有ListView了吗,为什么还要RecylerView呢?这就牵扯到第二个问题了。

2.RecyclerView的优点是什么?

 根据官方的介绍RecylerView是ListView的升级版,既然如此那RecylerView必然有它的优点,现就RecylerView相对于ListView的优点罗列如下:

①RecylerView封装了viewholder的回收复用,也就是说RecylerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的 逻辑被封装了,写起来更加简单。

②提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecylerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。例如:你想控制横向或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑布流对应的还有StaggeredGridLayoutManager等),也就是说RecylerView不再拘泥于ListView的线性展示方式,它也可以实现GridView的效果等多种效果。你想控制Item的分隔线,可以通过继承RecylerView的ItemDecoration这个类,然后针对自己的业务需求去抒写代码。

③可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecylerView有其自己默认的实现。

3.RecyclerView的用法

目前SDK中提供了三种自带的LayoutManager:

LinearLayoutManager:线性布局,横向或者纵向滑动列表
GridLayoutManager:表格布局
StaggeredGridLayoutManager:流式布局,例如瀑布流效果

效果展示:
可对item进行增加和删除。
这里写图片描述

实现步骤:

 1.创建一个继承于RecyclerView.Adapter的子类作为RecyclerView的适配器
 2.创建一个继承于RecyclerView.ViewHolder的子类作为当前适配器的viewholder 
 并将其作为RecyclerView.Adapter的泛型来使用(统一开发规范) 
3.实现当前适配器中的方法
4.加载布局,并初始化MyViewHolder,然后通过onCreateViewHolder返回 
5.通过onBindViewHolder方法填充控件

简单的RecyclerView使用方法:

一.添加依赖
这里写图片描述

二、编写代码
1.添加完依赖之后,就开始写代码了,与ListView用法类似,也是先在xml布局文件中创建一个RecyclerView的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

2.创建完布局之后在MainActivity中获取这个RecyclerView,并声明LayoutManager与Adapter,代码如下:

public class GridRecyclerViewActivity extends Activity {
    private RecyclerView recyclerView;

    private List<String> list;

    private RecyclerViewAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_grid);
        recyclerView = (RecyclerView) findViewById(R.id.recyclerview2);
        list = new ArrayList<String>();
        adapter = new RecyclerViewAdapter(this, list);
        initEvent();
        //如果想要一个Grid布局的列表,只要声明LayoutManager为GridLayoutManager即可:
        GridLayoutManager layoutManager = new GridLayoutManager(this, 4);
        /**
         * listview样式的滑动方向由setOrientation方法决定
         * LinearLayout.VERTICAL:竖向滑动
         * LinearLayout.HORIZONTAL:横向滑动
         * GridLayoutManager构造方法中的第二个参数:
         * 当setOrientation为LinearLayout.VERTICAL时,参数代表列数
         * 当setOrientation为LinearLayout.HORIZONTAL,参数代表行数
         */
        layoutManager.setOrientation(LinearLayout.VERTICAL);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(adapter);
        loadData();
    }

    private void initEvent() {
        adapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                //TODO 处理点击事件
                list.add(position,"添加");
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onItemLongClick(View view, int position) {
                //TODO 处理长按事件
                list.remove(position);//长按删除
               // adapter.notifyDataSetChanged();
            adapter.notifyItemRemoved(position);
            }
        });
    }

    private void loadData() {
        for (int i = 0; i < 100; i++) {
            list.add(i + "");
        }
        adapter.notifyDataSetChanged();
    }
}

3.接下来的问题就是Adapter的创建:
①onCreateViewHolder()
这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder需要我们自己去编写。直接省去了当初的convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。
②onBindViewHolder()
这个方法主要用于适配渲染数据到View中。方法提供给你了一个viewHolder,而不是原来的convertView。
③getItemCount()
这个方法就类似于BaseAdapter的getCount方法了,即总共有多少个条目。

public class RecyclerViewAdapter extends
        RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder>
{
    private Context context;

    private List<String> list;

    private OnItemClickListener onItemClickListener;

    public RecyclerViewAdapter(Context context, List<String> list)
    {
        this.context = context;
        this.list = list;
    }

    //创建新View,被LayoutManager所调用
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View convertview = LayoutInflater.from(context).inflate(
                R.layout.adapter_recycler_view, parent, false);
        Log.i("info", "onCreateViewHolder");
        return new MyViewHolder(convertview);
    }

    // 填充控件(同listview中的getView()方法,只作控件的赋值业务)

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position)
    {
        //将数据与界面进行绑定的操作
        holder.tv.setText(list.get(position));
        holder.itemView.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if (onItemClickListener != null)
                {
                    onItemClickListener.onItemClick(v, position);
                }
                Log.i("info", "itemView被点击了===>" + position);
            }
        });
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener()
        {
            @Override
            public boolean onLongClick(View v)
            {
                if (onItemClickListener != null)
                {
                    int pos = holder.getLayoutPosition();//TODO 该方法用于获得和更新当前的位置,防止错位
                    onItemClickListener.onItemLongClick(v, pos);
                }
                Log.i("info", "itemView被长按了===>" + position);
                // 长按的返回值:当返回true表示消费掉当前事件,会使后续的操作无法获取到该事件
                // 如果返回false,则可触发onClick监听
                return true;
            }
        });
    }

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

    /**
     * 继承于RecyclerView.ViewHolder的作用 1.统一开发规范 2.增强封装性
     */
    //自定义的ViewHolder,持有每个Item的的所有界面元素
    public class MyViewHolder extends RecyclerView.ViewHolder
    {
        private TextView tv;

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

    public interface OnItemClickListener
    {
        // 点击回调方法
        void onItemClick(View view, int position);

        // 长按回调方法
        void onItemLongClick(View view, int position);
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener)
    {
        this.onItemClickListener = onItemClickListener;
    }
}

不懂的可以再浏览下大神的博客,博客的连接是:http://blog.youkuaiyun.com/skykingf/article/details/50827141

Android Filter ListView, RecyclerView 今天整理的是之前项目中写的一个首页针对于列表进行条件过滤的效果。相关描述: 此次省略xxx字… 。 还是来看一下效果图吧(稍微有那么一点点大,1.5M左右,注意看好操作之后的变化):废话就不多说了,接下来直奔主题,先看一下我们的界面布局:<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schema 阅读详情

相关推荐

Android的ListView和RecyclerView的基本用法

在Android 5.0 版本之前,为了方便的显示多行数据,形如QQ聊天信息主界面,最常用的选择无非是ListView控件,但是ListView控件本身就有很大的局限性和效率问题(相对于RecyclerView控件)来说,比如说ListView只能竖向滚动显示数据,不能横向滚动显示数据,在一些特殊的需求中,ListView就无能为力了。在Android5.0版本之后,Android官方推出了一个新的

指点 2609

RecyclerView原生适配器

RecylerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能; 导入依赖: recyclerView是design包下的,所以要导入design依赖 implementation 'com.android.support:design:28.0.0' 布局管理器&amp;amp;适配器: 布局管理器 ①线性 Linea...

weixin_43807869的博客 1047

RecyclerView和ListView使用对比分析

又到了更新博文的时间了,最近在看一本很不错的心理学书籍,名字叫做 《拖延心理学》,封面长下面这样子书的内容主要是分析拖延症患者是如何把一件事一拖再拖,最后引发最终心里的焦虑和不安,甚至找了各种借口来做一些然并卵的自我安慰,最后再告诉你如何去改善自己的拖延症。目前我看了这书大约六分之一,就被各种心理分析打脸无数次,奈何此书写得太好,所以分享给有需要的童鞋(拖延症患者做好被无情打脸的心理准备)。刚好本...

D_clock爱吃葱花 1481

Listview和RecycleView的简单比较

谷歌说使用RecycleView的理由: RecyclerView is a more advanced and flexible version of ListView. This widget is a container for large sets of views that can be recycled and scrolled very efficiently. Use

Sanjay的专栏 1万+

基于FreeRTOS与MQTT的物联网技术应用系列——步进电机控制(三)SD卡驱动、FatFS等的移植和ini配置文件读取的实现

本文实现了基于STM32F107VC的金牛开发板的基于SPI模式的SD卡驱动和FatFS的移植,以及利用minini库对ini配置信息文件进行读取。

sqshining的专栏 2137

用Arduino和FS-i6X遥控器,从零开始打造你的第一只仿生扑翼蝴蝶(附完整代码解析)

本文详细介绍了如何利用Arduino和FS-i6X遥控器从零开始制作仿生扑翼蝴蝶,包括硬件准备、电路连接、代码解析和调试技巧。通过完整的代码示例和参数说明,帮助读者快速掌握仿生机器人的制作要点,实现蝴蝶的自然飞行效果。

weixin_28727975的博客 309

别再用ListView了,试试RecyclerView叭!

别再用ListView了,试试RecyclerView叭!

一条屈依的博客 7753

利用Python爬虫获取淘宝商品评论:实战案例分析

在数字化时代,数据的价值日益凸显,尤其是对于电商平台而言,商品评论作为用户反馈的重要载体,蕴含着丰富的信息。本文将详细介绍如何利用Python爬虫技术获取淘宝商品评论,包括代码示例和关键步骤解析。

2401_87849335的博客 2833

ListView 与 RecyclerView 简单对比

RecyclerView 与 ListView 的主要区别: 布局效果对比 常用功能与API对比 在Android L引入嵌套滚动机制(NestedScrolling) ListView与RecyclerView的简单使用: ListView: 1. 继承重写BaseAdapter类; 2. 自定义ViewHolder与convertView的优化(判断是否为null); Re...

shu_lance的博客 2万+

Image Sensor卷帘曝光(Rolling Shutter)基本原理以及对曝光行的通俗理解

由于CMOS sensor的曝光方式是一行一行的方式进行的,任何一个pixel的曝光时间是一样的,也就是同一行上的每个pixel的曝光开始点和曝光的时间都是一模一样的,所以同一行的所有点所接受到的能量是一样的,而在不同行之间虽然曝光时间都是一样的,但是曝光的开始点是不同的,所以不同行之间所接受到的能量是不一定相同的。至此完成了这一行的曝光。还是以桶装水为比喻: 排成一行的桶(桶的数量和每个桶的大小确定),每一曝光行为单位的时间内每一个桶加水都是一样,需要多少个曝光行才能使的所有水桶加起来的水达到1L。

大熊 3921

芯片工程师-必须掌握的linux操作-第一讲

一个从材料专业,转行芯片验证初级工程师,自己也是从0基础开始学习入门,更知道0基础的人应该怎么去学习。 现在工作三个多月了,特地花时间给大家写这篇文章。希望能关注、支持下。 为什么芯片验证工程师必须要学习linux命令? 答: ① 芯片工程师主要的职责,就是与IC设计工程师和系统工程师密切合作,开发验证平台,能够根据项目要求产生测试计划,产生代码及功能覆盖率,撰写验证报告。 ②简单点说,主要工作内容,是编写代码去验证设计的对不对。 那么问题来了,编写代码,在什么环境呢,我现在告诉你,都是在linux系统中进

小白蒋-材料转行芯片验证 4841

【Android】ListView和RecyclerView知识总结

SimpleAdapter是Android中用于将数据模型转换成ListView或其他视图组件的适配器。它简化了数据绑定过程,通过映射数据集中的字段到布局文件中的视图。是 Android 中的一种视图组件,用于显示可滚动的垂直列表。它通常用于显示一组相似的数据,比如联系人列表、消息列表等。是 Android 提供的一个更高级和灵活的列表视图控件,相对于。它引入了一些新的概念,如。模式,更高效的滚动和动画支持,以及更灵活的布局管理器(和数据源之间的桥梁,将数据源转换为可以显示在。中的字符串显示在列表视图中。

Patrick_yuxuan的博客 2622

科研牛马千万不要错过!手把手教你用AI精准匹配真实参考文献,仅需一个专业应用+两个提示词指令

当然也可以借助生成式AI,如GPT-5.2、Gemini 3 Pro粘贴段落,输入设计好的提示词,让模型根据段落内容匹配参考文献,并正确引用到段落合适位置,再按规范格式输出参考文献列表。阅读我提供的【正文文本】,为其中的关键论点寻找真实的、权威的参考文献(优先来源于Nature, Science, IEEE, ACM, PubMed等),并插入引用。若在段落中已经引用好了参考文献,也有参考文献列表,担心引用位置不当或论点、论述逻辑与文献不够契合,则可以用以下结构化提示词,让AI辅助审查。

智能AI让学术科研更容易 1031

RecyclerView和ListView的区别、RecyclerView优化

一 ListView和RecyclerView区别 ListView 1.Adapter继承的是BaseAdapter。 2.可以直接在布局中设置分割线。 3.点击事件自带setOnItemClickListener方法 4.自带增加头部尾部方法 addHeaderView和addFooterView...

无与伦比的猪 4144

STM32入门教程:自动门控制

通过这个简单的示例,我们展示了如何使用STM32微控制器来实现一个简单的自动门控制系统。如果有物体靠近门口,我们会改变doorState的值,并使用controlServoMotor函数来控制舵机电机的转动。具体的引脚连接可以根据您的具体硬件来定,例如将红外传感器的输出引脚连接到GPIOA_PIN0引脚。同样,具体的引脚连接可以根据您的具体硬件来定,例如将舵机的控制引脚连接到GPIOA_PIN1引脚。首先,我们需要包含必要的库文件和引用。然后,我们需要定义一些函数来处理红外传感器的输入和舵机电机的输出。

m0_75244442的博客 577

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ScrollableLayout从入门到精通:实现ListView与RecyclerView的无缝滚动

ScrollableLayout是一个强大的Android布局库,专注于实现共同头部与ViewPager、ListView、RecyclerView等滚动组件的无缝集成,帮助开发者轻松构建具有复杂滚动效果的现代应用界面。 ## 什么是ScrollableLayout? ScrollableLayout是一个专为Android平台设计的布局组件,它解决了在使用ViewPager切换不同滚动视图(

gitblog_00915的博客 613

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

RecyclerView 和 ListView对比

布局效果对比布局效果对比 RecyclerView默认支持线性布局,网格布局,瀑布流布局,同时支持横向,纵向滚动。 API ListView 继承重写BaseAdapter类 自定义ViewHolder和convertView一起完成复用工作 RecyclerView 继承重写RecyclerView.Adapter和RecyclerView.ViewHolder 设置布局管理器,设置布局效果 区别 ViewHodler编写规范化 RecyclerView复用item的工作封装好了,不需要Lis

云梦九章~ 9654

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Android】ListView与RecyclerView的基础使用

简单介绍了 ListView 和 RecyclerView 的基本用法

LiuYaoheng的博客 935

【Android】ListView与RecyclerView基础运用

接着我们需要创建一个自定义的适配器,这个适配器继承自ArrayAdapter,并将泛型是定位Fruit类@NonNull@Override定义了一个名为的公共类,它继承自类,并且指定了泛型参数Fruit,这意味着这个适配器是专门为处理Fruit类型对象的列表而设计的。声明了一个私有的整型变量resourceId,用于存储列表项的布局资源ID。定义了的构造函数,它接受三个参数::上下文对象,用于访问系统服务和资源。:列表项的布局资源ID。:一个包含Fruit。

2301_79344902的博客 1022

【Android面试】Listview和Recyclerview的区别

请你谈谈Listview和Recyclerview的区别Listview和Recyclerview的区别(阿里一面,滴滴一面,被问到)简单比较布局上局部刷新item view的重用ViewHolder嵌套滑动机制空数据处理Listview的二级缓存ActiveViewsScrapViewsRecyclerview的四级缓存RecyclerRecycledViewPoolViewCacheExtension Listview和Recyclerview的区别(阿里一面,滴滴一面,被问到) 简单比较 listvi

Rose J 的博客 5931

ListView与RecyclerView的区别

RecyclerView 与 ListView 的主要区别:布局效果对比常用功能与API对比在Android L引入嵌套滚动机制(NestedScrolling)缓存机制ListView与RecyclerView的简单使用:ListView: 1. 继承重写BaseAdapter类; 2. 自定义ViewHolder与convertView的优化(判断是否为null...

msc694955868的博客 2918

RecyclerView与ListView

为何google推出了RecyclerView,它与ListView相比有什么优势呢?RecyclerView是否可以完全替代ListView呢? 在缓存机制原理方面 ListView与RecyclerView缓存机制原理大致相似。都是离屏的ItemView即被回收至缓存,入屏的ItemView则会优先从缓存中获取。当然他们是的实现细节还是有差异的 。 ListView ListView有...

u011433937的博客 362

Android ListView 和 RecyclerView

ListView 和 RecyclerView 都是用于 Android 开发中列表展示时所用的常见控件。 ListView 和 RecyclerView 使用的大致相同点 1.使用前都需要准备适配器 Adapter :其实这两个控件的使用在初学者眼里之所以看起来复杂,最大的原因就是需要根据自己的业务来写一个Adapter类 2.使用前都需要准备 item 的 layout :除了准备一个适配器 Adapter 之外,还需要为列表中的每一项准备一个共用的 layout 。 3.使用时都是先初始化一个

yang451212的博客 3380

RecyclerView和ListView原理

转载请注明链接: Android 最后修改版本:2018/8/13-1(0:52) Android ListView RecycleBin 缓存流程 RecyclerView RecyclerView和ListView对比 参考资料 1、RecyclerView和ListView缓存原理 离屏的ItemView即被回收至缓存 入屏的ItemV...

feather(猎羽) 2902
上一篇: 使用SurfaceView播放视频,调节进度,滑动屏幕调节音量并显示音量。
下一篇: 实现打开Android系统相册、照相机并实现照相,录像功能。
Allen-华
博客等级 码龄11年 10粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值