ListView总结

ListView的使用——qml 前言 之前有一阵子一直写qml,现在隔了半年,已经忘得差不多了。如果不是看着以前的代码能回想起一些东西,我恐怕以为之前只是幻想罢了。 最近终于有点时间可以琢磨东西,或者说有时间选择用什么语言写,写成什么样的。正好现在有一个简单的界面,所以就拿来练手,用qml写一个稍微好看一点的界面。这个项目里面有一个列表展示,所以就用到了今天我想说的ListView了:ListView我觉得是最常用的了吧,特别他的一些基本东西,如model、delegate都是很多控件(GridView PathView)都需要配置的 阅读详情
 ListView总结(多选框ListViiew,动态加载,多线程更新ListView中的进度条)

Why ListView?ListView 如果仅仅出于功能上的需求ListView可能没有存在的必要,ListView能作的事情基本上ScrollView也能胜任。ListView存在的最根本的原因在于它的高效([url=]如何实现的?[/url]).ListView通过对象的复用从而减少内存的消耗,也减少了对象的创建从而也减少的cpu的消耗(在Androidk中创建View对象经常伴随着解析xml)。ListView的本质是一张bitmap(当然所有的控件文字等在屏幕上看到的最终都会变成bitmap),ListView会按照需求,根据Adapter提供的信息把需要的Item画出来显示在屏幕上,当屏幕滚动的时候会重新计算Item的位置并绘制出新的bitmap显示在屏幕上。这样听起来感觉可能不是很高效,但这样带的好处就是,每用为一第个Item 创建一个View对象,样式一样的对象可以共用一个View对象,减少了内存的消耗。而且ListView是事件驱动的,只有当需要的时候才会重新绘制,并且只会 绘制当前屏幕上所显示的Items.
How To Use?ListView 离不开Adapter,通常的作法创建一个类继承BaseAdapter,Override getCount()和getView()等方法。生成这个类的对象,调用ListView的setAdapter()与ListViw进行绑定。
How Does It work?ListView会调用跟其绑定的Adapter的getCount()方法知道有多少个Item需要展示,然后循环调用getView(int position, View convertView, ViewGroup parent)知道第position个Item该怎么画,并画出来直到把当前的ListView的空间填满。当Adapter当中的数据改变时,需调用notifyDataSetChanged ()告诉Adapter数据发生了变化或者给Adapter注册一个观察者registerDataSetObserver (DataSetObserver observer)。当Adapter得知与其绑定的数据己发生改变时间,会再次调用getCount()方法,并循环调用getView(int position, View convertView, ViewGroup parent)刷新当前页面。

Item 1

Item 2

Item 3

Item 4

Item 5

Item 6

Item 7

Item 8

当这个ListView
向上滚动需要创建一个Item9 同时,有些对象(比如Item1 )不在显示区域将看不到,这时android 将会把item1 的 引用传递给 Adapter.getView() 中的convertView这样我们就不用再创建一个View来存放Item9,只需要把原来的item1对象作下修改,就可以重复使用了
;我们也不用担心convertView
是不是正确的类型,这个由系统保证,所以我们要作的就是把convertView
转换(经常需要向下转型)成我们自己的View 再给它赋值,in this case :(TextView) convertView.setText(“Item9”);


public View getView(int position, View convertView, ViewGroup parent) {
if (convertView ==
null) {
//this would be first time to show the item,so we need to create it
convertView = mInflater.inflate(R.layout.item, null);
}
//we grab the convertView,modify it and reuse it
((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);
return convertView;
}


调用方法所需要的消耗要比访问变量高得多,而上面的代码一次又一次的调用findViewById()方法,作着重复的事情。所以我们可以进一步进行如下优化: 创建一个类用来保存一些View的引用,这样我们就可以直接使用,而不用再调用findViewById().因为我们所保存的只是引用不是对象本身,所以不用担心会占用大量内存
static
class ViewHolder {
TextView text;
ImageView icon;
}

public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder;
if (convertView ==
null) {
convertView 
= mInflater.inflate(R.layout.list_item_icon_text, null);
holder 
=
new ViewHolder();
holder.text 
= (TextView) convertView.findViewById(R.id.text);
holder.icon 
= (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} 
else {
holder 
= (ViewHolder) convertView.getTag();
}
//we store the reference ,so that we don’t have to call findViewById() over and over again
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap((position 
&
1) ==
1
? mIcon1 : mIcon2);
return convertView;
}


上图是T-mobile g1上采集的的数据,现在看来可能现在不是很准确,但其性能上的差异还是很有参考价值的。
Tips & TricksListView是为了大容量数据展示而设计的。如果数据量(Item的数量)不是很大,且用ListView实现起来比较麻烦,不妨换种思路,不使用ListView,而用ScrollView来实现。
如果Item信息布局比较复杂或者Item的数量很多,出于性能的考虑,建议自定义一个View组件实现需要的功能,而不是组合其它控件达到所要的效果。
ListView滚动变黑:在xml中给ListView增加一个属性android:cacheColorHint="#00000000" 。当ListVIew中有很多Item,有时候需要快速的滚动。比如从第一个Item滚动到第600个Item这个时候,中间的很多Item对用户来说意义不是很大,但android却要调用 adapter.getView()方法将这些Item逐一画出,并且因为滚动很快用户不希望有任何的延迟。这在一些低端手机比如g1,是很难作到的。所以google工程师想出的一个办法是在滚动的时候,让屏幕变黑用一张黑色bitmap盖住ListView,而不去绘制中间过程中的很多Item,从而提升性能。
Item有自己的背景盖住了Selector光标:在xml中给ListView增加一个属性:android:drawSelectorOnTop="true"这样光标就会跑到Item上面的图层,解决我们的问题。
Snippets多选框ListView
  
带有进度条的ListView,多个子线程刷新各自的进度,如果子线程很多那么刷新就会变得很频繁,我们可以由一个handler负责统一刷新,这样我们就要以增加一些额外条件限制刷新的次数和条件

分批加载的原理很简单,给ListView添加一个OnScrollListener监听滚动事件,当用户滚动到屏幕到特定的位置时加载新数据,并给LIstView加一个正在加载的footerView,当加载数据结束时再把这个footerView去掉。

如果有什么疑问,发现bug或者有更好的想法或者建议,或者附件无法下载。请发邮件至arthurbrown@163.com
工程源码


http://www.microdu.com/thread-6074-1-1.html

Flutter开发之——可滑动组件—ListView 二 ListView。 阅读详情

相关推荐

LISTVIEW使用指南 (VB6)

LISTVIEW控件并不是默认的工具箱的配置项目,你必须要手工添加---单击"工程"菜单项目,选择"部件",在部件对话框的"控件"栏目中选择"MICROSOFT WINDOWS COMMON CONTROLS 6.0",确认在它前面的复选框中有一个黑色的对号,单击"确认" 按钮,这时你的工具箱中便添加了几个控件,其中,有五个空心圆圈的便是LISTVIEW控件了, 当然怎么把它...

weixin_34395205的博客 3600

Android笔记-ListView总结(多选框ListViiew,动态加载,多线程更新ListView中的进度条)...

Why ListView? ListView 如果仅仅出于功能上的需求ListView可能没有存在的必要,ListView能作的事情基本上ScrollView也能胜任。ListView存在的最根本的原因在于它的高效(如何实现的?).ListView通过对象的复用从而减少内存的消耗,也减少了对象的创建从而也减少的cpu的消耗(在Androidk中创建View对象经常伴随着解析xml)。ListVi...

weixin_30861459的博客 261

Android快速入门:动态更新ListView数据

当按钮被点击时,我们修改itemList集合中第一项数据的名称和描述,并调用适配器的notifyDataSetChanged()方法通知ListView数据发生了改变。首先创建了一个数据模型类,然后编写了适配器类将数据模型与ListView进行关联,最后演示了如何在点击事件中动态更新数据并通知ListView刷新界面。在动态更新ListView数据之前,我们需要先创建一个数据模型,用于存储列表中的每一项数据。接下来,我们需要编写一个适配器类,用于控制ListView中每一项数据的显示。

CyberLynxX的博客 804

android listview多线程刷新各自的进度,Android多线程中使用Handler更新ListView控件数据...

在Android应用开发中,免不了涉及耗时的操作,比如网络数据更新等。如果直接在主线程中完成,不给出适当的提示信息,则长时间的等待会给用户一个错觉:程序死了!所以,针对耗时的操作,使用多线程操作结合ProgressDialog进度条对话框来实现就显得非常的必要了。假设MainActivity中有一个名为list的ListView布局,点击按钮后执行DownloadData() 方法开始下载数据。/...

weixin_28894541的博客 718

C#中实现带百分比进度条的ListView控件_20211203_121409.rar

C# winform,重写ListView控件,让它实现每一行都带百分比的进度条,在实际项目中经常用到,所以留在这里与各位分享,如果有疑问,欢迎VX:VPAmway,共同交流学习编程知识

C++开发基础之掌握常用的三种异步编程模型

以上是三种常见的C++异步编程模型,每种模型都有其适用的场景和特点。根据具体需求,你可以选择合适的模型来进行异步编程。

dotnet研习社 2177

知识梳理:Android子线程中更新UI的3种方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前看一下Android中消息机制: [img]http://dl2.iteye.com/upload/attachment/0101/9078/241481c3-2d08-3468-bb21-a6f989e77e6a.jpg[/img] [quot...

沉淀之路—Android 848

HFSS 3D LAOUT PCB 裁剪,差分线,过孔仿真和优化

我本身不是做天线设计的,所以HFSS这个软件给我主要还是做PCB级别的高速信号完整性仿真,一般2.5D的仿真软件无法对过孔和跨平面进行仿真。所以要借助三维电磁软件进行。今天就针对PCB进行裁剪。为什么要裁剪?以为如果把整个PCB一起仿真的话,应该要好几个月吧。所以为了加快仿真速度,必须进行裁剪仿真。①candence的PCB可以直接导入。那么先导入brd文件,file-import-candence结果如下②点击cutout,选中要仿真的net和参考平面。这里最好选creat new不然会把原文件覆盖掉。注

gjatwfn的专栏 1万+

android 请教各位大神一个用线程自动刷新 listview 的问题,在线等。急!!

先上代码 : mainactivity中的 handler  List> listItems =  new ArrayList>();   Map listItem = new HashMap();    @SuppressLint("HandlerLeak") Handler handler = new Handler() {         public void han

quhunjie3064的博客 1053

LaTeX公式转Word竟这么简单?Python三行代码实现学术论文格式无忧

本文介绍如何利用Python的latex2word库,仅需三行代码即可将LaTeX数学公式精准转换为Word原生Office Math对象,解决学术写作中LaTeX与Word格式割裂的难题。该方法支持批量处理、格式保真,并能与Markdown、Jupyter Notebook等工具集成,构建自动化写作流程,实现学术论文格式无忧。

qsc90123456的博客 297

从RadixTree到哈希表:深入对比SGLang和vLLM的Prefix Cache实现差异

本文深入对比了SGLang与vLLM在大语言模型推理服务中实现Prefix Cache(前缀缓存)的两种核心方案。SGLang采用基于Radix Tree的RadixAttention,支持任意长度前缀的精确匹配与灵活复用;vLLM则采用基于哈希表的方案,深度集成于PagedAttention,实现简洁但要求块级精确对齐。文章剖析了二者在设计哲学、内存管理、适用场景及集群级优化(如Prefix Cache Aware Routing)上的关键差异,为高性能LLM服务的技术选型提供决策依据。

blockchain9miner的博客 956

WIN32 ListView消息处理。

创建完ListView之后,就需要对列表做一些操作。而win32程序呢,是通过使用消息来传递你要做什么,谁做。 所以,我们就需要对某些我们感兴趣的消息做一些处理。而现在,我们只对处理ListView这个控件感兴趣。 在窗口过程函数里,在switch中添加一个caseWM_NOTIFY;这个消息通知控件的父窗口控件中已发生事件或控件需要某种信息。 添加一行这样的代码:NM_L...

qq_42008055的博客 2264

ERGM指数随机图模型全解析:从基础原理到R语言实操

从社交网络中的互惠、传递性和同质性等基本现象切入,介绍网络数据与传统回归分析的本质差异——边与边之间的依赖关系。指数随机图模型(ERGM)正是为刻画这种依赖结构而设计的统计框架,它通过指数族分布将网络结构效应显式建模,结合MCMC方法完成参数估计。ERGM在组织协作、传播扩散、生物生态等领域的应用日益广泛,其扩展模型TERGM、GERGM和多层ERGM进一步支持时序、权重与多重关系网络。本文系统梳理ERGM的理论基础、核心统计量、扩展模型选型及R语言实操要点,帮助研究者理解网络生成机制并完成收敛性诊断与结果

weixin_29050271的博客 365

wpf中listview就是可以这么简单——小白用listview系列

记录下每一个让我蛋疼的问题,说不定以后还会用得着。 关于wpf中listview的使用, 首先在xaml中使用listview,代码如下

a962755614的博客 6万+

修复Oracle MySQL Server 安全漏洞(CVE-2023-0464)

修复Oracle MySQL Server 安全漏洞(CVE-2023-0464)

路~可以走过 3683

Transformer模型详解

​本文主要介绍Transformer系列,从基础到理论,对注意力机制进行总结并解释《Attention is all you need》,提出解决sequence to sequence问题的transformer模型,用全attention的结构代替了lstm,抛弃了之前传统的encoder-decoder模型必须结合cnn或者rnn的固有模式,只用attention。文章的主要目的是在减少计算量和提高并行效率的同时不损害最终的实验结果。

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 5311

ListView滚动条的换肤方案

因项目需要准备对LISTVIEW的滚动条进行自绘。于是在网上搜了一下,问题没解决,却搜出一篇令人不愉快的帖子 。确实,那时候实力是不够的,但现在应该是没问题了,为这个目的才不断磨练自己的。LISTVIEW控件的滚动条是系统自带的,它不创建窗口。对LISTVIEW窗口本身进行子类化后,要处理一些跟滚动条有关的消息。首先是要骗过WM_NCPAINT消息。这个十分容易。WM_NCPAINT消息的

superarhow的专栏 1万+

18、基于FSDD数据集的深度学习案例分析

本文基于FSDD(Free Spoken Digit Dataset)数据集,系统介绍了深度学习在语音数字识别中的应用。内容涵盖动态与静态计算图的对比、数据预处理流程(包括数据增强、固定长度处理和归一化)、监督学习与无监督学习的模型构建与训练过程,并通过实验对比了不同网络架构的性能。文中使用PyTorch实现2层全连接网络和自编码器模型,展示了正则化技术对提升模型准确率的关键作用。最后总结了关键技术并提出了实际应用建议,展望了未来在复杂模型、多模态融合和实时应用方向的发展潜力。

vscode6remote的博客 260

Flutter---ListView

ListView 是 Flutter 中用于显示滚动(垂直/水平)列表的 Widget,可以高效地展示大量数据。 ListView():一次性构建所有子项 ListView.separated():自动添加分隔组件 ListView.builder():按需构建子项,性能最优 ListView.custom():使用 SliverChildDelegate

m0_50891221的博客 597

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

VB ListView 隔行背景

Private Sub SetListViewColor(Lv As ListView, pic As PictureBox, LvCount As Long) Dim i As Integer pic.BackColor = Lv.BackColor Lv.Parent.ScaleMode = vbTwips pic.ScaleMode = vbTwips

yanzhibo的专栏IlgawME)Y*Ml 3220

WINCC7.3破解文件

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

QML类型——ListView

正文 为列表模型(ListModel)的所有元素提供列表视图。 详细说明 ListView显示内置QML类型(例如ListModel和XmlListModel)创建的模型数据,或者使用C++定义的自定义模型类(继承QAbstractItemModel或QAbstractListModel)创建的数据。 ListView有一个Model(定义要显示的数据)和一个Delegate(定义如何显示数据)。ListView中的元素可以水平或垂直放置。列表视图本质上是可以拖动的,因为ListView继承Flickabl

fengyanyu68的博客 8917

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

解决Flutter的ListView嵌套ListView滑动冲突以及无限高度问题

关键代码 shrinkWrap: true, //解决无限高度问题 physics:NeverScrollableScrollPhysics(),//禁用滑动事件 可滑动控件都有这两个属性,给子滑动部件设置上这两个参数,即可办到子ListView跟随父ListView滑动。 demo 代码 import 'package:flutter/material.dart'; class BossMa...

骑猪也能看夕阳 5315

emWin中向LISTVIEW单元格中添加信息

如果LISTVIEW原为空表,在向单元格中添加信息前,需先添加行:LISTVIEW_AddRow(hItem, NULL); 然后再使用函数void             LISTVIEW_SetItemText         (LISTVIEW_Handle hObj, unsigned Column, unsigned Row, const char * s);向单元格中写数据。 例:

xiaomei2010280的博客 3817

ucGUI ListView里显示图标

ucGUI库的版本是3.94,LISTVIEW里没有设置显示图标的功能。自己加了一个方法来显示。 作了如下的几点修改可以了。 1:修改LISTVIEW_ITEM结构,新增一个变量记录bmp图标。 typedef struct { WM_HMEM hItemInfo; WM_HMEM hDrawObj; char acText[1]; } LISTVIEW_ITEM; 2

HELLO 4120

ListView

/

波波诸葛伟 1539

让ListView回来原来的位置

让ListView回到原来的位置 当从ListView中的某一个Item跳转到其他的Activity,进行操作之后,ListView可能需要刷新(重新加载数据源),这个时候ListView就会回到原始的状态,即:从第一个Item开始显示。我们要做的是让它回到原来的位置 //记录当前的ListView的位置 private int CURRENT_LISTVIEW_ITEM_POS...

weixin_30645617的博客 446
上一篇: org.json.JSONException: No value for
下一篇: Android中OnScrollListener回调具体剖析
wx1qq1com
博客等级 码龄18年 123粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值