一、ListView内容变化后,动态刷新的步骤(全局刷新):

(1)更新适配器Adapter数据源;(不要使用匿名内部类)

(2)调用适配器Adapter的刷新方法notifyDataSetChanged();

二、ListView中的单个item的数据变化后,动态刷新步骤(局部刷新):

1、引言  

  有个下载模块,因为可能同时下载好几个数据,所以用的listview展示所有正在下载的内容。因为下载进度要实时更新,所以要不停的调用notifyDateSetChanged刷新数据。这样会不停的重新绘制整个listview的界面,性能开销非常大。而且如果每个item有图片的话,每个item的图片都需要重新加载,就算图片做了内存缓存,刷新一下图片也会闪一下,不停的刷新就会导致各个item的图片不停的闪,体验一点都不好。

  那么对于上面问题,有没有解决办法呢?当然是有的。我们可以针对某一个item进行局部更新,而不影响其它没有修改的item。

2、下面我们来介绍一下如何对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单条更新:

  1. private void updateSingleRow(ListView listView, long id) {
  2. if (listView != null) {
  3. int start = listView.getFirstVisiblePosition();
  4. for (int i = start, j = listView.getLastVisiblePosition(); i <= j; i++)
  5. if (id == ((Messages) listView.getItemAtPosition(i)).getId()) {
  6. View view = listView.getChildAt(i - start);
  7. getView(i, view, listView);
  8. break;
  9. }
  10. }
  11. }

3、下面当然要结合具体的案例说明ListView单条更新,具体流程如下:

(1)新建一个Android工程,命名为"listviewUpdate",如下:

(2)来到主布局文件activity_main.xml,如下:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context=".MainActivity" >
  6. <ListView
  7. android:id="@+id/lv"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent" >
  10. </ListView>
  11. </RelativeLayout>

布局效果图,如下:

ListView的Item的布局list_item.xml,如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <TextView
  7. android:id="@+id/tv"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:text="test"
  11. android:textColor="#ff000000" />
  12. <TextView
  13. android:id="@+id/tv1"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_margin="20dp"
  17. android:text="bbb"
  18. android:textColor="#ff000000" />
  19. </LinearLayout>

布局效果图,如下:

(3)接下来,来到主界面MainActivity,如下:

  1. package com.example.listviewupdate;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.os.CountDownTimer;
  7. import android.view.Menu;
  8. import android.view.View;
  9. import android.view.ViewGroup;
  10. import android.widget.AdapterView;
  11. import android.widget.AdapterView.OnItemClickListener;
  12. import android.widget.BaseAdapter;
  13. import android.widget.ListView;
  14. import android.widget.TextView;
  15. public class MainActivity extends Activity implements OnItemClickListener {
  16. private static final String TAG = "MainActivity";
  17. private ListView lv;
  18. private List<String> list = new ArrayList<String>();
  19. private MyAdapter adapter;
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main);
  24. for (int i = 0; i < 55; i++) {
  25. list.add("======" + i);
  26. }
  27. lv = (ListView) findViewById(R.id.lv);
  28. lv.setOnItemClickListener(this);
  29. adapter = new MyAdapter();
  30. lv.setAdapter(adapter);
  31. }
  32. @Override
  33. public boolean onCreateOptionsMenu(Menu menu) {
  34. // Inflate the menu; this adds items to the action bar if it is present.
  35. getMenuInflater().inflate(R.menu.activity_main, menu);
  36. return true;
  37. }
  38. class MyAdapter extends BaseAdapter {
  39. @Override
  40. public int getCount() {
  41. return list.size();
  42. }
  43. @Override
  44. public Object getItem(int position) {
  45. return list.get(position);
  46. }
  47. @Override
  48. public long getItemId(int position) {
  49. return position;
  50. }
  51. @Override
  52. public View getView(int position, View convertView, ViewGroup parent) {
  53. if (convertView == null) {
  54. convertView = View.inflate(getApplicationContext(),
  55. R.layout.list_item, null);
  56. holder = new ViewHolder();
  57. holder.tv = (TextView) convertView.findViewById(R.id.tv);
  58. holder.tv1 = (TextView) convertView.findViewById(R.id.tv1);
  59. convertView.setTag(holder);
  60. } else {
  61. holder = (ViewHolder) convertView.getTag();
  62. }
  63. holder.tv.setText(list.get(position));
  64. holder.tv1.setText("test----------" + position);
  65. return convertView;
  66. }
  67. }
  68. ViewHolder holder;
  69. class ViewHolder {
  70. TextView tv, tv1;
  71. }
  72. @Override
  73. public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
  74. new MyTimer(10000, 1000, arg2).start();
  75. }
  76. class MyTimer extends CountDownTimer {
  77. int pos;
  78. public MyTimer(long millisInFuture, long countDownInterval, int pos) {
  79. super(millisInFuture, countDownInterval);
  80. this.pos = pos;
  81. }
  82. @Override
  83. public void onFinish() {
  84. int firstVisiblePosition = lv.getFirstVisiblePosition();
  85. int i = pos - firstVisiblePosition;
  86. if (i >= 0) {
  87. View view = lv.getChildAt(i);
  88. if (view != null) {
  89. ViewHolder mHolder = (ViewHolder) view.getTag();
  90. mHolder.tv.setText("end");
  91. }
  92. }
  93. list.set(pos, "end");
  94. }
  95. @Override
  96. public void onTick(long millisUntilFinished) {
  97. int firstVisiblePosition = lv.getFirstVisiblePosition();
  98. int i = pos - firstVisiblePosition;
  99. if (i >= 0) {
  100. View view = lv.getChildAt(i);
  101. if (view != null) {
  102. ViewHolder mHolder = (ViewHolder) view.getTag();
  103. mHolder.tv.setText("ing" + millisUntilFinished / 1000);
  104. }
  105. }
  106. list.set(pos, "ing" + millisUntilFinished / 1000);
  107. }
  108. }
  109. }

(4)布署程序到模拟器,如下:

Android进阶笔记13:ListView篇之ListView刷新显示(全局 和 局部)的更多相关文章

  1. Android进阶笔记13:RoboBinding(实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架)

    1.RoboBinding RoboBinding是一个实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架.从简单的角度看,他移除了如addXXListen ...

  2. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...

  3. Android进阶笔记:AIDL内部实现详解 (二)

    接着上一篇分析的aidl的流程解析.知道了aidl主要就是利用Ibinder来实现跨进程通信的.既然是通过对Binder各种方法的封装,那也可以不使用aidl自己通过Binder来实现跨进程通讯.那么 ...

  4. Android进阶笔记14:ListView篇之ListView性能优化

    1. 首先思考一个问题ListView如何才能提高效率 ? 当convertView为空时候,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象.当convertView不 ...

  5. Android进阶笔记11:ListView篇之ListView性能优化

    1. 首先思考一个问题ListView如何才能提高效率 ? 当convertView为空时候,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象.当convertView不 ...

  6. Android进阶笔记16:ListView篇之ListView刷新显示(全局 和 局部)

    一.ListView内容变化后,动态刷新的步骤(全局刷新): (1)更新适配器Adapter数据源:(不要使用匿名内部类) (2)调用适配器Adapter的刷新方法notifyDataSetChang ...

  7. Android进阶笔记11:ListView篇之ListView显示多种类型的条目(item)

    ListView可以显示多种类型的条目布局,这里写显示两种布局的情况,其他类似. 1. 这是MainActivity,MainActivity的布局就是一个ListView,太简单了这里就不写了,直接 ...

  8. Android进阶笔记10:ListView篇之ListView显示多种类型的条目(item)

    ListView可以显示多种类型的条目布局,这里写显示两种布局的情况,其他类似. 1. 这是MainActivity,MainActivity的布局就是一个ListView,太简单了这里就不写了,直接 ...

  9. Android进阶笔记15:ListView篇之图片优化

    1.图片异步加载: (1)处理图片的方式: 如果ListView中自定义的Item中有涉及到大量图片的,一定要对图片进行细心的处理,因为图片占的内存是 ListView 项中最头疼的,处理图片的方法大 ...

随机推荐

  1. 联想g400怎么进bios设置u盘启动图文教程

    联想g400怎么进bios设置u盘启动图文教程 转自http://www.kqidong.com/bios/3940.html 虽然成功学会u盘装系统的人很多,但是设置u盘启动在小白们的眼中却没有那么 ...

  2. PIE SDK矢量数据的投影转换

    1. 功能简介 目前在地理信息领域中数据包括矢量和栅格两种数据组织形式 ,每一种数据都可以对投影进行转换,目前PIE SDK支持矢量和栅格数据的投影转换功能,下面对矢量数据的投影转换功能进行介绍. 2 ...

  3. c#高级写法

    Linq的参考资料:https://www.cnblogs.com/liqingwen/p/5801249.html 1.判断str字符串中的逗号个数 string str = "1,2,3 ...

  4. 飞檐走壁navMesh

    http://www.manew.com/thread-106030-1-1.html

  5. FileZilla的使用(包括Server和Client两个程序)

    1.安装 FileZillaServer和FileZillaClient,到官网去下载 https://filezilla-project.org/ 2.启动 FileZillaServer 它会提示 ...

  6. DIV水平垂直居中的CSS兼容写法

    DIV水平垂直居中,非IE浏览器可以用CSS3来处理,IE浏览器中分别处理IE6和/IE7.IE8.IE9. 在IE低版本中,虽然大致上没有问题,但还是有一些细微的显示问题. 示例如下: <!D ...

  7. Programmer Competency Matrix--ref--http://sijinjoseph.com/programmer-competency-matrix/

    Note that the knowledge for each level is cumulative; being atlevel n implies that you also know eve ...

  8. 【卷土重来之C#学习笔记】(三) 类的基本概念

    1.类的概述   程序的数据和功能被组织为逻辑上相关的数据项和函数的封装集合,并被称为类.   类是一个能存储数据并执行代码的数据结构. 它包含数据成员和函数成员: 数据成员:存储与类或类的实例相关数 ...

  9. mysql 存储过程(proceduce)查询一个表的结果插入另外一个表

    公司的时间戳存证业务,对发版过程中间数据处理需要用到存储过程.对此做一个简短记录,以免遗忘. DROP procedure record_timestamp_deal ; ##创建存储过程 creat ...

  10. springboot整合mongo多数据源

    该实例已测试 POM.XML <!-- Spring Boot mongodb 依赖--> <dependency> <groupId>org.springfram ...