【提升栈】ListView优化

Android ListView高效实现与优化教程 本文还有配套的精品资源,点击获取 简介:ListView是Android中用于展示列表数据的关键组件, MyListView 项目提供了实际的代码示例,帮助开发者掌握如何高效使用ListView。课程内容涵盖了ListView的基础结构、Adapter模式、ViewHolder优化、监听器设置、性能优化、下拉刷新与上拉加载、自定义ListView、动画效果、数... 阅读详情
前言

ListView优化一直是一个老生常谈的问题。无论是面试还是寻常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看怎样最大化的优化ListView的性能。

  • 1.在adapter中的getView方法中尽量少使用逻辑
  • 2.尽最大可能避免GC
  • 3.滑动的时候不载入图片
  • 4.将ListView的scrollingCache和animateCache设置为false
  • 5.item的布局层级越烧越好
  • 6.使用ViewHolder

1.在adapter中的getView方法中尽量少使用逻辑

不要在你的getView()中写过多的逻辑代码,我们能够将这些代码放在别的地方。比如:

优化前的getView():

@Override
public View getView(int position, View convertView, ViewGroup paramViewGroup) {
        Object current_event = mObjects.get(position);
        ViewHolder holder = null;
        if (convertView == null) {
                holder = new ViewHolder();
                convertView = inflater.inflate(R.layout.row_event, null);
                holder.ThreeDimension = (ImageView) convertView.findViewById(R.id.ThreeDim);
                holder.EventPoster = (ImageView) convertView.findViewById(R.id.EventPoster);
                convertView.setTag(holder);

        } else {
                holder = (ViewHolder) convertView.getTag();
        }

       //在这里进行逻辑推断。这是有问题的 
        if (doesSomeComplexChecking()) {
                holder.ThreeDimention.setVisibility(View.VISIBLE);
        } else {
                holder.ThreeDimention.setVisibility(View.GONE); 
        }

        // 这是设置image的參数,每次getView方法运行时都会运行这段代码。这显然是有问题的
        RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams(measuredwidth, rowHeight);
        holder.EventPoster.setLayoutParams(imageParams);

        return convertView;
}

优化后的getView():

@Override
public View getView(int position, View convertView, ViewGroup paramViewGroup) {
    Object object = mObjects.get(position);
    ViewHolder holder = null;

    if (convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.row_event, null);
            holder.ThreeDimension = (ImageView) convertView.findViewById(R.id.ThreeDim);
            holder.EventPoster = (ImageView) convertView.findViewById(R.id.EventPoster);
            //设置參数提到这里,仅仅有第一次的时候会运行,之后会复用 
            RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams(measuredwidth, rowHeight);
            holder.EventPoster.setLayoutParams(imageParams);
            convertView.setTag(holder);
    } else {
            holder = (ViewHolder) convertView.getTag();
    }

    // 我们直接通过对象的getter方法取代刚才那些逻辑推断。那些逻辑推断放到别的地方去运行了
    holder.ThreeDimension.setVisibility(object.getVisibility());

    return convertView;
}

2.GC 垃圾回收器

当你创建了大量的对象的时候。GC就会频繁的运行。所以在getView()方法中不要创建非常多的对象。最好的优化是,不要在ViewHolder以外创建不论什么对象。假设你的你的log里面发现“GC has freed some memory”频繁出现的话。那你的程序肯定有问题了。

你能够检查一下:
a) item布局的层级是否太深
b) getView()方法中是否有大量对象存在
c) ListView的布局属性

3.载入图片

假设你的ListView中须要显示从网络上下载的图片的话。我们不要在ListView滑动的时候载入图片,那样会使ListView变得卡顿,所以我们须要再监听器里面监听ListView的状态。假设滑动的时候,停止载入图片,假设没有滑动,则開始载入图片

listView.setOnScrollListener(new OnScrollListener() {

            @Override
            public void onScrollStateChanged(AbsListView listView, int scrollState) {
                    //停止载入图片 
                    if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) {
                            imageLoader.stopProcessingQueue();
                    } else {
                    //開始载入图片
                            imageLoader.startProcessingQueue();
                    }
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                    // TODO Auto-generated method stub

            }
    });

4.将ListView的scrollingCache和animateCache设置为false

scrollingCache: scrollingCache本质上是drawing cache,你能够让一个View将他自己的drawing保存在cache中(保存为一个bitmap),这样下次再显示View的时候就不用重画了,而是从cache中取出。默认情况下drawing cahce是禁用的。由于它太耗内存了,可是它确实比重画来的更加平滑。

而在ListView中,scrollingCache是默认开启的,我们能够手动将它关闭。

animateCache: ListView默认开启了animateCache,这会消耗大量的内存,因此会频繁调用GC,我们能够手动将它关闭掉

优化前的ListView

<ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:cacheColorHint="#00000000"
        android:divider="@color/list_background_color"
        android:dividerHeight="0dp"
        android:listSelector="#00000000"
        android:smoothScrollbar="true"
        android:visibility="gone" /> 



优化后的ListView

<ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@color/list_background_color"
        android:dividerHeight="0dp"
        android:listSelector="#00000000"
        android:scrollingCache="false"
        android:animationCache="false"
        android:smoothScrollbar="true"
        android:visibility="gone" />

5.降低item的布局的深度

我们应该尽量降低item布局深度,由于当滑动ListView的时候,这回直接导致測量与绘制,因此会浪费大量的时间。所以我们应该将一些不必要的布局嵌套关系去掉。降低item布局深度

6.使用ViewHolder

这个大家应该非常熟悉了,可是不要小看这个ViewHolder,它能够大大提高我们ListView的性能

后文

ListView的优化我们已经讲完了。假设在你的项目中。这些基本优化你还没有做到的话。那么你的ListView是有问题的,还有非常大的提升潜力。以后再使用ListView的时候,一定要将这几点考虑进去,发挥它的最大的性能。

这些东西其实只要技术到了一定高度,经验多了就很稀疏平常。

学无止境,更多的知识在等着我们去学习。

需要学习进阶框架技术的可以扫码领取资料!

**《Android架构开发手册》**Android进阶框架学习教材

由于文章内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要**《Android架构开发手册》**完整文档的可以加微信 即可免费领取!

### **目录**

img

img

【WRF后处理】基于wrf-python处理wrf运行结果wrfout_d01 基于wrf-python处理wrf运行结果wrfout_d01 阅读详情

相关推荐

同济土木非0基础三个月跨考复旦计算机攻略

跨考cs攻略前言我cs专业课如何复习How to start from zero简历其他复试 前言 建议多去工地/化工厂涡轮增压一下 我 同济土木gpa 3.2/5 挂科 * n 辣鸡项目 * n (padding 简历) 21考复旦计算机专硕 10月-12月 学习+复习 总分392 政治 68;背肖4即可 英语二 78 裸考,(高考英语140+);做点真题,建议据自己情况准备 数学二 142 ;(高考数学接近满分);做真题+模拟题,每天写一张试卷 专业课 104 ,考试生病了,下文展开。 cs专业课

piglake的博客 7237

Android最常用的控件ListView(详解)

一.ListView简介 在Android开发中,ListView是一个比较常用的控件。它以列表的形式 展示具体数据内容,并且能够根据数据的长度自适应屏幕显示。 二.ListView简单用法 代码部分 1.布局界面 activity_main.xml 代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/ap...

indeedes的博客 8万+

ST-Link V2的隐藏技能:多通道串口调试的终极指南

本文深入探讨了ST-Link V2的多通道串口调试功能,突破传统烧录工具的限制。通过详细的硬件配置、Arduino IDE设置和实战案例,展示了如何利用SWD接口实现多通道数据监控,提升STM32F103C8T6等开发板的调试效率。文章还提供了PCB布局优化和性能调优技巧,助力开发者充分发挥ST-Link V2的潜能。

weixin_29285605的博客 355

Android(14) ArrayAdapter(数组适配器)的三种方法

ArrayAdapter数组适配器用于绑定格式单一的数据,数据源可以是集合或者数组 列表视图(ListView)以垂直的形式列出需要显示的列表项。 实现过程:新建适配器->添加数据源到适配器->视图加载适配器 第一种:直接用ListView组件创建 列表每一行只有一行文字 效果如图: activity_list布局: <?xml version="1.0" e...

郑清 5万+

本地部署大模型框架 LMStudio和Ollama+WebUI对比

之前我们的辣妈系列文章介绍了很多如何使用Ollama框架+OpenWebUI做很多大模型框架下相关的事情。之后我们也尝试了LMStudio这样一体化的工具。本文介绍下LMStudio 和 Ollama+Web UI 各有优劣,具体选择取决于你的需求。

ms44的专栏 4028

【位运算进阶之----右移(>>)】

😄嘻嘻,朋友们,大家好!昨天我们学习了左移,今天我们来谈谈右移>>。⭐️简单来说,,也就是去掉一个数的二进制表达的末位,右移一位就去掉一位,右移两位就去掉两位。下面就让我们来详细看看吧!

weixin_73453526的博客 8931

Android--ListView作用详解

1.ListView   ListView列表视图控件是Android中常用的控件之一,其直接继承了AbsListView,是一个以垂直方式在项目中显示View视图的列表。ListView的数据项,来自一个继承了ListAdapter接口的适配器。   ListView的常用属性一般就是用来设置列表的间隔、分割线、表头、表尾等属性的,常用属性有以下几个,并且Android也为其提供了对应的se...

streate的专栏 5705

Linux下开机异常(fsck exited with status code 4)

Linux下开机异常事情是这样的,本来我呢跑着程序听着歌,结果忽然就死机了,我只能强制关机,再次打开系统的时候,就提示这样fsck from util-linux 2.26.2 /dev/sda10 contains a file system with errors, check forced. /dev/sda10: Inodes that were part of a corrupted pr

芳草碧连天 2万+

ListView详细介绍与使用

前言介绍: 关于 ListView 我们大家都应该是非常的熟悉了,在 Android 开发中是经常用到的,今天就再来回顾一下,ListView 的使用方法,和一些需要优化注意的地方,还有日常开发过程中的一些小技巧和经验。 ListView 简介 ListView 是 Android 系统为我们提供的一种列表显示的一种控件,使用它可以用来显示我们常见的列表形式。继承自抽象类 AdapterView...

sydMobile专栏 1万+

CST Studio Suite安装详细教程(附安装包)CST Studio Suite 2024超详细安装教程

CST Studio Suite 2024安装指南摘要:本文详细介绍了CST Studio Suite 2024电磁仿真软件的下载与安装流程,包含23个图文步骤说明,从解压安装包到配置许可证服务器。重点提示了以管理员身份运行、自定义安装路径等关键步骤,并提供了常见问题解决方案和入门技巧。该软件适用于天线设计、PCB分析等高频电磁场仿真,安装后需通过localhost:27000连接许可证服务器完成激活。

pythonqiang9的博客 1万+

单细胞转录组数据分析中的基因ID注释转换问题:如何解决才能注释所有的UMIcount数据?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1126

Android基础——ListView

ListViewListView是什么?纯列表ListViewListView定制使用 ListView是什么? ListView以列表的形式展现数据,用户可通过对屏幕的上下滑动加载数据。 纯列表ListView 在activity_main.xml中加入ListView: <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_he

松仔Log的博客 6041

线性代数-第24篇:线性代数在控制系统中的核心应用

线性代数通过状态空间建模、矩阵分解与优化算法,为控制系统提供了从理论分析到工程实现的完整框架。从传统PID控制到现代智能控制,其应用贯穿系统设计、分析与优化的全流程。未来,随着多智能体协同控制、量子控制系统等前沿领域的发展,线性代数将在高维矩阵计算、分布式优化等方向持续创新,为复杂控制系统的突破提供核心支撑。如果对线性代数在控制系统中的应用细节有疑问,欢迎在评论区留言!

无 423

如何用 CMake 交叉编译 X Server:XoDos termux-x11 构建系统完整源码剖析

XoDos 是一款把完整的 X.Org X Server 交叉编译进 Android 设备的开源应用,其 `termux-x11` 模块借助 CMake 与 Android NDK,将 X Server 及其十几个依赖库构建成一个原生动态库,从而让桌面图形界面直接运行在手机屏幕上。本文将带你剖析这套构建系统的设计思路与关键源码。 [![XoDos 运行在 Android 上的 X Server

gitblog_00942的博客 1118

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

OpenHarmony中Flutter ListView性能优化实战

在跨平台开发中,ListView作为Flutter的核心组件,其性能直接影响应用流畅度。通过Widget复用机制和const构造函数优化,可显著降低重建开销。针对OpenHarmony特有的方舟编译器AOT特性,需要结合动态构建与分页加载策略,有效管理内存占用。图片加载采用缓存方案如cached_network_image,配合OpenHarmony的轻量化图形栈,能提升65%的滚动帧率。实际开发中,通过Performance Overlay和DevTools监测UI/GPU线程负载,结合平台通道优化,可在

weixin_29227425的博客 173

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

FlutterUnit列表优化:ListView性能提升技巧

在Flutter应用开发中,ListView作为最常用的滚动组件之一,承载着大量的数据展示任务。然而,随着数据量的增加,列表性能问题逐渐凸显:卡顿、内存占用过高、滚动不流畅等问题严重影响用户体验。FlutterUnit作为一个集成了大量Widget示例的开源项目,其列表性能优化尤为重要。 本文将深入探讨FlutterUnit中ListView的性能优化技巧,帮助开发者构建高效流畅的列表界面。 ...

gitblog_00695的博客 896

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ListView与BaseAdapter优化:提升IoT-Firstep安卓应用性能的10个技巧

在IoT-Firstep物联网开发项目中,安卓应用作为重要的用户交互界面,其性能优化至关重要。ListView作为Android开发中最常用的列表控件,在物联网设备管理、传感器数据显示等场景中扮演着关键角色。本文将分享10个实用的ListView与BaseAdapter优化技巧,帮助您提升IoT-Firstep安卓应用的响应速度和用户体验。 ## 为什么ListView性能优化如此重要?🤔

gitblog_00131的博客 1124

ListView的四种优化方式

优化方式一: 第一种优化就是重用convertView,这也是最简单的一种优化方式,就是在Adapter类的getView方法中通过判断convertView是否为null,是的话就需要在创建一个视图出来,然后给视图设置数据,最后将这个视图返回给底层,呈现给用户;如果不为null的话,其他新的view可以通过复用的方式使用已经消失的条目view,重新设置上数据然后展现出来。

肖坤的博客 2万+

如何提升ListView的运行效果

当快速的滚动ListView,而每次都需要去加载一遍,就会成为性能的瓶颈. 一.根据参数优化 这是可以用ListView中getView()方法中提供的convertView参数,这个参数用于将之前加载好的布局进行缓存,方变后面使用. public class FruitAdapter extends ArrayAdapter<Fruit> { …… @Override public View getView(int position, View convertView, ViewGroup p

DZMNLFH的博客 459

Android QuickReturn ListView进阶技巧:动画效果与交互体验提升

QuickReturn ListView是实现Roman Nurik和Nick Butcher提出的Quick Return UI模式的Android列表视图组件,它能让列表头部或底部视图在滚动时智能显示或隐藏,显著提升用户交互体验。本文将分享三个实用进阶技巧,帮助开发者优化动画效果和交互体验,打造更流畅的列表界面。 ## 一、核心实现原理:理解QuickReturn机制 QuickRetur

gitblog_00973的博客 876

android ListView优化

作为一个android开发不知道多少年的开发者来说,除了四大组件之外,我觉得开发过程中最需要注意的就是在使用listview的优化。关于listview的优化我有几个心得:未优化的代码:public View getView(int position, View convertView, ViewGroup parent) { final yuangongBean.DataBean pro...

丁辉祥的博客 2491

ListView优化功能

//初始化组件 listView = (ListView) findViewById(R.id.ListView); text_title = (TextView) findViewById(R.id.text_title); //设置标题 text_title.setText("数据展示"); list = new ArrayList<Bea...

qq_44574528的博客 289

如何更好的优化 ListView 控件的性能

ListView 控件说是最难用的控件,有一个缺点就是性能较差,有很多细节需要优化,比如,每次展示ListView 子项时就会调用一次 getView() 方法,在getView() 方法的参数中,有一个 convertView 参数我们还没有使用,打印下 convertView 的值为nul,这个参数主要是用于将之前加载好的布局进行缓存。

小曾同学的博客 1356

ListView优化方案

作为客户端,其最主要的任务就是最直观的和用户交互。从服务器拿数据,解析过后显示数据,根据用户操作按照一定的协议传回数据,达到用户想要的结果。这是我自己的理解,

小小随笔屋 613

Android 入门第四讲02-列表ListView(ListView item高度问题,ListView控件缺点,ListView控件优化(面试常问问题),ListView控件二次优化)

这里写目录标题1.ListView item高度问题2.ListView控件缺点 ListView知识回顾,listview控件一个大致的原理是,listview本身界面里面是没有任何东西展示的,它里面的数据的需要一个adapter,adapter能产生数据,然后经过adapter再将数据填充到listview控件里,这就是listview为什么能显示内容的原因。 1.ListView item高度问题 问题:我们在之前写item布局的时候给定了item高度,但是仔细观察发现并没有生效,这里我们换一种

Rose J 的博客 1767

提升ListView运行效率两个方法

一、首先我们先实现ListView的构建工作 1.定义一个实体类,作为ListView适配器的适配类型。新建Fruit类,代码如下: package org.lxh.demo; public class Fruit { private String name; private int imageId; public Fruit(String name, int image

张亚运的专栏 2307
上一篇: Android音视频(FFmeng)进阶开发,程序员进阶热门,学成涨薪5k+
下一篇: 腾讯T 13大佬“被裁”!我也想这样
Agent学习路线
博客等级 码龄6年 1万+粉丝 1902原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值