ListView的简单优化

简介: 本文介绍了通过使用`ViewHolder`模式优化`ListView`适配器的原理与实现。核心思想是创建一个容器(`ViewHolder`)来存储复用的`View`,减少`findViewById`的调用次数,从而提升性能。在`BaseAdapter`的`getView`方法中,通过判断`convertView`是否为空,决定是否需要重新初始化视图。如果`convertView`为空,则利用`LayoutInflater`加载布局并绑定`ViewHolder`到视图;否则直接从视图的标签中获取已有的`ViewHolder`。这种方式有效降低了资源消耗,提高了列表渲染效率。

原理:创建一个容器装要复用的View,设置判断,达到减少findViewById的次数的效果
MainActivity如下,这个比较简单就不解释了
1.png

主要讲下适配器:
继承BaseAdapter后实现四个方法
具体解释如下图(两图是一起的,最后会放源码)
2.png
3.png

上图所示:在getview方法中有三个参数,起到优化的部分为ViewHolder的使用,主要方法setTag(),getTag()。

适配器代码如下:

public class Myadapter extends BaseAdapter {
    List<String> date;
    Context context;

    //构造方法
    public Myadapter(List<String> date, Context context) {
        this.date = date;
        this.context = context;
    }

    //获取ListView的总条目数
    @Override
    public int getCount() {
        return date.size();
    }

    //条目的索引
    @Override
    public Object getItem(int position) {
        return date.get(position);
    }

    //获取条目的位置
    @Override
    public long getItemId(int position) {
        return position;
    }

    /*
     * 渲染(填充),调用data.size次
     * position 索引
     * convertView 条目的View
     * parent :Listview
     * */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        //当convertView首次加载的时候
        if (convertView == null) {
            //获取打气筒
            LayoutInflater inflater = LayoutInflater.from(context);
            //填充单个Item
            convertView = inflater.inflate(R.layout.item_main, null);
            //获取Viewholder对象,减少findViewById的次数
            holder = new ViewHolder();
            //从填充的条目View中找到我们所关心的控件
            holder.textView = convertView.findViewById(R.id.tv_my);
            //将holder装进convertView的口袋
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        //填充数据
        holder.textView.setText(date.get(position));
        return convertView;
    }
    //创建一个容器装要复用的View
    static class ViewHolder {
        TextView textView;
    }
}
AI 代码解读
目录
打赏
0
1
1
0
100
分享
相关文章
Android利用SVG实现动画效果
本文介绍了如何在Android中利用SVG实现动画效果。首先通过定义`pathData`参数(如M、L、Z等)绘制一个简单的三角形SVG图形,然后借助`objectAnimator`实现动态的线条绘制动画。文章详细讲解了从配置`build.gradle`支持VectorDrawable,到创建动画文件、关联SVG与动画,最后在Activity中启动动画的完整流程。此外,还提供了SVG绘制原理及工具推荐,帮助开发者更好地理解和应用SVG动画技术。
148 30
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
551 2
OkHttp源码解析(小白必看,建议收藏)
本文详细解析了OkHttp3的源码及其实现机制,适合初学者学习。文章从Request与Response结构、HTTPS握手过程、响应码含义、Socket概念到责任链模式的应用逐一讲解。重点分析了OkHttp的工作流程:通过Call对象的enqueue()或execute()方法发起请求,核心是getResponseWithInterceptorChain(),利用拦截器链处理请求,包括用户自定义拦截器、重试、桥接、缓存、连接等步骤。最后还探讨了Dispatcher的任务调度机制。
492 71
Android使用EditText+Listview实现搜索效果(使用room模糊查询)
本文介绍如何在Android中使用EditText与ListView实现搜索功能,并结合Room数据库完成模糊查询。主要内容包括:Room的模糊查询语句(使用`||`代替`+`号)、布局美化(如去除ListView分割线和EditText下划线)、EditText回车事件监听,以及查询逻辑代码示例。此外,还提供了相关扩展文章链接,帮助读者深入了解ListView优化、动态搜索及Room基础操作。
236 65
Android用Canvas画一个折线图,并加以简单封装
本文介绍了如何用Java绘制动态折线图,从固定折线图的实现到封装成可复用的组件。首先通过绘制XY坐标轴、添加坐标标签和绘制折线及数据点完成基础折线图。接着,将静态数据替换为动态输入,支持自定义X轴、Y轴和折线数据。代码中包含关键方法如`drawDaxes`(绘制坐标轴)、`drawAxispoint`(绘制坐标点)和`drawbrokenLine`(绘制折线)。最终实现可根据传入数据动态生成折线图,适用于Android开发中的数据可视化场景。
104 0
Android自定义view之网易云推荐歌单界面
本文详细介绍了如何通过自定义View实现网易云音乐推荐歌单界面的效果。首先,作者自定义了一个圆角图片控件`MellowImageView`,用于绘制圆角矩形图片。接着,通过将布局放入`HorizontalScrollView`中,实现了左右滑动功能,并使用`ViewFlipper`添加图片切换动画效果。文章提供了完整的代码示例,包括XML布局、动画文件和Java代码,最终展示了实现效果。此教程适合想了解自定义View和动画效果的开发者。
155 65
Android自定义view之网易云推荐歌单界面
一篇文章带你走近Android自定义view
这是一篇关于Android自定义View的全面教程,涵盖从基础到进阶的知识点。文章首先讲解了自定义View的必要性及简单实现(如通过三个构造函数解决焦点问题),接着深入探讨Canvas绘图、自定义属性设置、动画实现等内容。还提供了具体案例,如跑马灯、折线图、太极图等。此外,文章详细解析了View绘制流程(measure、layout、draw)和事件分发机制。最后延伸至SurfaceView、GLSurfaceView、SVG动画等高级主题,并附带GitHub案例供实践。适合希望深入理解Android自定义View的开发者学习参考。
412 84
Android SVG动画详细例子
本文详细讲解了在Android中利用SVG实现动画效果的方法,通过具体例子帮助开发者更好地理解和应用SVG动画。文章首先展示了动画的实现效果,接着回顾了之前的文章链接及常见问题(如属性名大小写错误)。核心内容包括:1) 使用阿里图库获取SVG图形;2) 借助工具将SVG转换为VectorDrawable;3) 为每个路径添加动画绑定属性;4) 创建动画文件并关联SVG;5) 在ImageView中引用动画文件;6) 在Activity中启动动画。文末还提供了完整的代码示例和源码下载链接,方便读者实践操作。
217 65
Android关于BottomNavigationView效果实现指南
本文详细介绍了Android中BottomNavigationView的实现与定制方法,涵盖颜色设置、图标修改、字体大小调整及多色图标处理等问题。通过XML和Java代码两种方式,解决图标颜色变化、点击效果等问题,并提供去除ActionBar的实现步骤。适合初学者及进阶开发者参考,助力打造更美观、功能丰富的底部导航栏。文末附源码,方便实践操作。
232 28
Android关于BottomNavigationView效果实现指南
星闪开发入门级教程之安装编译器与小项目烧录
这是一篇关于星闪(新一代近距离无线连接技术)开发入门的教程,适合新手学习。文章从安装Hispark Studio编译器开始,详细讲解了环境配置、项目创建、代码修改及烧录过程。通过一个简单的红灯闪烁Demo,演示了GPIO控制和任务调度的基本用法。同时提供了功能代码解析,帮助理解LED高低电平控制原理。附有开发板相关资料链接,方便进一步学习。适合对嵌入式开发感兴趣的初学者参考实践。
207 20
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问