博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android进阶笔记13:ListView篇之ListView刷新显示(全局 和 局部)
阅读量:4560 次
发布时间:2019-06-08

本文共 6426 字,大约阅读时间需要 21 分钟。

一、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     3         if (listView != null) {  4             int start = listView.getFirstVisiblePosition();  5             for (int i = start, j = listView.getLastVisiblePosition(); i <= j; i++)  6                 if (id == ((Messages) listView.getItemAtPosition(i)).getId()) {  7                     View view = listView.getChildAt(i - start);  8                     getView(i, view, listView);  9                     break; 10                 } 11         } 12     }

 

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

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

 

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

1 
6 7
11
12 13

布局效果图,如下:

 

 

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

1 
2
6 7
13 14
21 22

布局效果图,如下:

 

 

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

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

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

转载于:https://www.cnblogs.com/hebao0514/p/5266336.html

你可能感兴趣的文章
优先队列(堆)
查看>>
C语言中函数参数传递的本质是值传递
查看>>
noip2018游记
查看>>
redis分布式锁
查看>>
判断手机andriod还是iphone
查看>>
POJ-2528 Mayor's posters (线段树区间更新+离散化)
查看>>
7.24
查看>>
软件工程开发项目作业
查看>>
nginx学习之——虚拟主机配置
查看>>
HBase数据导入导出工具
查看>>
SpringAop--系统日志简例
查看>>
leetcode Candy
查看>>
Android系统Intent中的Uri使用
查看>>
事件模拟场景经典例子
查看>>
洛谷—— P1407 工资
查看>>
洛谷——P3128 [USACO15DEC]最大流Max Flow
查看>>
洛谷—— P1190 接水问题
查看>>
Windows Phone开发之Coding4Fun对话框操作类
查看>>
现代3D图形编程学习-关于本书
查看>>
linux系统下php安装mbstring扩展的二种方法
查看>>