一.简述

先来介绍一下listview更新数据的几种方法,目前我知道的方法有如下3种:

  • 每次更新数据时都调用 listview.setAdapter();
  • 每次更新数据时都调用 adapter.notifyDataSetChanged();
  • 在自定义的adapter中定义update方法;

二.分析

1.每次更新数据时都调用 listview.setAdapter();

不管你其它的数据需不需要刷新,它都会将所有的数据刷新一遍,也就是说将整个listview刷新一遍。当ListView之前绑定过adapter信息时,会清除原有Adapter和数据集观察者等信息,重置了ListView当前选中项等信息,并在方法的最后调用requestLayout进行界面的重绘,效率最低。估计会一点Android的人都不会用这种方法,但我们还是将其列出来,可以与其它方法进行对比。

2.每次更新数据时都调用 adapter.notifyDataSetChanged();

与setAdapter()方法一样,调用adapter.notifyDataSetChanged()也会引起界面重绘,区别是前者是回到初始状态,后者会保留原有位置、数据信息等。如果适配器的内容改变,notifyDataSetChanged()方法将会通过一个外部方法强制调用getView来刷新每个Item的内容。(这句话是网上看到的,说的也不是太清楚,看了一下notifydatasetchanged()源码也不是很清楚。),这个方法在数据量比较少,刷新频率比较慢的情况下还是不错的。

3.在自定义的adapter中定义update方法;

更新指定地方指定位置的数据,比如说Listview第4个item项的第2个TextView变化,那么它就只更新这里,其他的不会更新。数据量较大时,这种方法会优于第二个。

    /*** 数据更新时刷新单个item* @param position 当前item在listview中的position* @param lv 当前listview*/public void update(int position, ListView lv) {int firstVisiblePosition = lv.getFirstVisiblePosition();//获取对应item的View对象View view = lv.getChildAt(position - firstVisiblePosition);ViewHolder holder = (ViewHolder) view.getTag();holder.name = (TextView) view.findViewById(R.id.name);holder.age = (TextView) view.findViewById(R.id.age);holder.name.setText(list.get(position).name);holder.age.setText(list.get(position).age);}

listview.getChildAt()是获取当前listview可见项中某个item的View对象。也就是说firstVisiblePosition是第0项,lastVisiblePosition是最后一项。所以这里的参数为:对应position-firstVisiblePosition。

ListView更新的几种方法相关推荐

  1. dapper mysql 批量_MySQL数据库之c#mysql批量更新的两种方法

    本文主要向大家介绍了MySQL数据库之c#mysql批量更新的两种方法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 总体而言update 更新上传速度还是慢. 1:  简单的 ...

  2. android 使用系统下载并更新版本,安卓系统更新升级的种方法

    最近有网友问小编"安卓系统怎么升级?",针对该问题,笔者也在网上查找了下相关资料,不过并没有找到什么有价值的相关介绍,多数都是介绍如何自动升级.或者下载升级版包等等方法,对于一些常 ...

  3. mybatis批量更新数据三种方法效率对比

    探讨批量更新数据三种写法的效率问题. 实现方式有三种, 1> 用for循环通过循环传过来的参数集合,循环出N条sql,需要在db链接url后面带一个参数  &allowMultiQuer ...

  4. mybatis批量更新数据三种方法

    具体的可以参考下面链接: ​​​​​​mybatis批量更新数据三种方法效率对比_PreciousLife的博客-CSDN博客_mybatis 批量更新 此处说明下,若是使用for循环遍历方式,来生成 ...

  5. mysql update 批量更新_mysql 批量更新的两种方法

    本文介绍两种批量更新数据方法 数据准备 create table account ( id int auto_increment primary key, balance int not null ) ...

  6. sublime 设置自动更新_Win10关闭自动更新的三种方法

    Win10怎么关闭自动更新呢?很多人都不知道,下面小编来告诉大家. 第一种方法 我们右击电脑左下角的微软按钮,弹出的界面,我们点击运行: 弹出的运行中,我们输入services.msc,之后点击确定: ...

  7. 代码操作Word时,目录自动更新的两种方法

    最近的项目中有一个功能点为:根据分析数据库并生成报告.不过不是大数据.数据挖掘之类,报告的内容.组织方式都是事先固定下来的.实现的方式为,在普通word文档中插入书签制成模板,然后程序使用OpenXM ...

  8. node.js中mysql批量插入更新的三种方法

    [背景]在项目中遇到一个批量插入数据的需求,由于之前写过的sql语句都是插入一个对象一条数据,于是去网上搜关键词 "sql批量插入"."mysql批量插入"等, ...

  9. win10的更新怎么关闭计算机,如何彻底关掉win10自动更新_彻底关掉win10自动更新的三种方法...

    win10专业版每隔一段时间就会进行更新补丁,这样会使系统更加稳定,偶尔更新一次大家都能够接受,如果天天都弹出自动更新的提醒确实让人困惑,那么有什么办法彻底关掉win10自动更新?电脑小白都不懂操作步 ...

  10. PCB笔记(六):allegro 误删元件丝印,又无法回退怎么办?元器件更新的两种方法:同类元件封装一键更新和单个元件更新的方法。

    前言 误删元件封装的丝印又无法回退,怎么办呢?不要慌,更新元件封装即可.这里给出两种更新封装的方法.第一种方法是所有同类的封装都更新一遍(适合大量封装丝印被误删时使用),第二种则只针对选中的封装进行更 ...

最新文章

  1. Warshall算法多源点之间最短路径的算法最短距离
  2. 人工智能和机器学习在治安管理方面意义重大
  3. Luogu 2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
  4. sqlplus登录Oracle时ORA-01017: invalid username/password; logon denied的错误
  5. Storm中的LocalState 代码解析
  6. VisualSVN server——批量添加用户
  7. cssd oracle,Oracle RAC /etc/init.d/init.cssd startcheck
  8. Ubuntu锐捷校园网连接不上问题,认证成功但是上不去网。
  9. 43w+条手机电话号码归属地数据库免费下载·附区号邮编
  10. [ecshop调试]ecshop 数据库查询缓存详解 有三种缓存,query_cache(数据库查询缓存)、static_cache(静态缓存)和cache(普通的缓存)
  11. 计算机的储存容量1kb等于多少byte,1M等于多少字节?
  12. Bootstrap栅格系统(屏幕大小)
  13. React构建的景点门票系统
  14. ant-design vue上传 多文件 、单文件上传
  15. CentOS 7.3安装详解
  16. 《上古卷轴5:天际》控制台代码之装备
  17. bilibili下载的m4s格式视频如何还原为mp4?
  18. border渐变 ios_iOS实现颜色渐变
  19. 软件测试基础知识 - 说一说黑盒与白盒的测试方法
  20. libreCAD源码阅读笔记1

热门文章

  1. 思科 mds 虚拟服务器,Cisco MDS系列交换机VSAN功能简介
  2. python爬虫设计实验
  3. 利用python处理pdf文本,帮我省下不少钱
  4. 小米工作室AIoT开发平台高校创新赛报名启动
  5. python面向对象实现算术编码
  6. ELK+filebeat+redis 日志分析平台
  7. 硬盘img镜像备份工具
  8. 中兴b860a拆机_【中兴ZXV10B860A魔盒外观展示】接口|线材|插线_摘要频道_什么值得买...
  9. keepalived mysql 主主_MySQL主主+Keepalived高可用(一):解决单点故障
  10. Matlab中求解总体标准差和样本标准差的区别(std函数)