对于使用listView配合adapter进行刷新的方法大家都不陌生,先刷新adapter里的数据,然后调用notifydatasetchange通知listView刷新界面。

方法虽然简单,但这里面涉及到一个效率的问题,调用notifydatasetchange其实会导致adpter的getView方法被多次调用 (画面上能显示多少就会被调用多少次),如果是很明确的知道只更新了list中的某一个项的数据(比如用户点击list某一项后更新该项的显示状态,或者 后台回调更新list某一项,等等),应该尽量避免getView被无辜的多次调用,特别是当后台线程特别多,回调的频率特别高,并且界面的布局优化得不是特别好的时候,使用notityDataSetChaned()方法来更新界面就会显得列表卡顿,用户体验不佳。

下面我们来介绍一下如何对listView进行单条刷新:

首先我们看一下adapter的getView方法,我们要进行单条刷新就要手动调用这个方法。

public View getView(int position, View convertView, ViewGroup parent)

那么这三个参数是如何确定的呢,第三个参数很好确定,就是你的listview。

为了确定另外两个参数position和converView,这里介绍几个lisView的新方法:

getFirstVisiblePosition(),该方法获取当前状态下list的第一个可见item的position。

getLastVisiblePosition(),该方法获取当前状态下list的最后一个可见item的position。

getItemAtPosition(int position),该方法返回当前状态下position位置上listView的convertView

ps:这里的convertView是复用的,也就是说不管position的值是多大(这个要看你整个list有多大),converView的个数应该始终是屏幕上能显示的list的条数那么多。

所 以,我们通过从getFirstVisiblePosition的值到getLastVisiblePosition的值之间的listitem和需要进 行更新的条件(比如id)进行比较确定哪一个是要更新的(如果不在当前可是范围内也就没有必要更新了,等list拉动的时候自然就会更新出来)

代码如下,其实这个方法是google 2011年开发者大会上提出的方法——ListView单条更新:

private void updateSingleRow(ListView listView, long id) { 
   
        if (listView != null) { 
            int start = listView.getFirstVisiblePosition(); 
            for (int i = start, j = listView.getLastVisiblePosition(); i <= j; i++) 
                if (id == ((Messages) listView.getItemAtPosition(i)).getId()) { 
                    View view = listView.getChildAt(i - start); 
                    getView(i, view, listView); 
                    break
                
        
    }
 

来自:http://blog.csdn.net/yuyuanhuang/article/details/43198107

Android ListView 单条刷新方法实践及原理解析的更多相关文章

  1. ListView单条刷新的方法

    我们一般会调用notifydatasetchange通知listView刷新界面.但会造成getView方法被多次调用(画面上能显示多少就会被调用多少次),如果是很明确的知道只更新了list中的某一个 ...

  2. ListView列表刷新方法的区别

    ListView列表刷新方法的区别 ListView对象的刷新方法: listNote.invalidate();重绘所有组件listNote.invalidateViews();重绘组件[包含所有的 ...

  3. Android进阶:七、Retrofit2.0原理解析之最简流程【下】

    紧接上文Android进阶:七.Retrofit2.0原理解析之最简流程[上] 一.请求参数整理 我们定义的接口已经被实现,但是我们还是不知道我们注解的请求方式,参数类型等是如何发起网络请求的呢? 这 ...

  4. 【转】UIAutomator定位Android控件的方法实践和建议(Appium姊妹篇)

    原文地址:http://blog.csdn.net/zhubaitian/article/details/39777951 在本人之前的一篇文章<<Appium基于安卓的各种FindEle ...

  5. UIAutomator定位Android控件的方法实践和建议(Appium姊妹篇)

    在本人之前的一篇文章<<Appium基于安卓的各种FindElement的控件定位方法实践和建议>>第二章节谈到Appium可以通过使用UIAutomator的方法去定位And ...

  6. Android listview局部刷新和模拟应用下载(zhu)

    在android开发中,listview是比较常用的一个组件,在listview的数据需要更新的时候,一般会用notifyDataSetChanged()这个函数,但是它会更新listview中所有可 ...

  7. 转:android listview局部刷新和模拟应用下载

    在 android开发中,listview是比较常用的一个组件,在listview的数据需要更新的时候,一般会用 notifyDataSetChanged()这个函数,但是它会更新listview中所 ...

  8. android黑科技系列——微信抢红包插件原理解析和开发实现

    一.前言 自从几年前微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...

  9. Android ListView动画实现方法

    在Android中listview是最经常使用的控件之中的一个,可是有时候我们会认为千篇一律的listview看起来过于单调,于是就产生了listView动画,listview载入了动画会让用户体验更 ...

随机推荐

  1. 【JQuery Plugin】WdatePicker

    <div class="timeSelect reportDate"> <span>查询时间:</span> <input type=&q ...

  2. 自己动手为PHP7添加新的语法特性

    好文章! nikic介绍了如何向PHP添加新的语法特性,原文写的非常精彩,具体是添加in语法功能,使最终实现: <?php $words = ['hello', 'world', 'foo', ...

  3. Web Deploy发布网站一条龙解决方案

    Web Deploy工具对于ASP.NET开发人员来说一定不陌生,没有用过也经常见到,Web Deploy发布十分方便而且在发布时会帮助用户检验发布文件的正确性.接下来介绍一下基础使用. 第一步:安装 ...

  4. BestCoder Round #50 (div.1) 1001 Distribution money (HDU OJ 5364)

    题目:Click here 题意:bestcoder上面有中文题目 #include <iostream> #include <cstdio> #include <cst ...

  5. 理解iOS 8中的Self Sizing Cells和Dynamic Type

    http://www.cocoachina.com/ios/20140922/9717.html 在iOS 8中,苹果引入了UITableView的一项新功能--Self Sizing Cells,对 ...

  6. 在线QQ客服

    代码一: <a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=451314789&si ...

  7. linux下C++开发工具

    就C++开发工具而言,与Windows下微软(VC, VS2005等)一统天下相比,Linux/Unix下C++开发,可谓五花八门,各式各样.Emacs, vi, eclipse, anjuta,kd ...

  8. Codeforces Round #198 (Div. 2) C. Tourist Problem

    C. Tourist Problem time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  9. WinForm - 格式化DataGridView单元格数据

    效果: 代码: /// <summary> /// 格式化数据 /// </summary> private void dataGridView1_CellFormatting ...

  10. [置顶] ssize_t与size_t-linux

    ssize_t: signed size_t [注释:signed 有符号] size_t: 标准C库中定义的,应为unsigned int [注释:unsigned 无符号] 一.size_t 增强 ...