ListView中 局部刷新Item 实现下载进度条局部更新

来源:互联网 发布:js 比较数值相等 编辑:程序博客网 时间:2024/05/21 09:19

问题引入:

demo中需做个下载个下载管理界面。同时只能下载一个任务,但是下载队列可以有多个下载任务。

当更新当前正在下载的任务的时候,使用 notifyDataSetChanged();方法会使整个页面都会刷新。

而且进度更新比较频繁,这就造成了内存的消耗和页面卡顿(在进度更新很频繁的情况),笔者甚至出现了卡住页面无法进行操作的情况。

所以想到了能不能局部刷新某个Item。也查了下资料,问题解决。

解决思路:

通过listview.getFirstVisiblePosition()方法获取到显示的item的首个位置 ,再根据position, 计算出view的位置。获取到具体的view后,对view进行操作,就能够实现局部刷新了。

关键代码:

  1. public void updateView(int itemIndex) {  
  2.         //得到第一个可显示控件的位置,  
  3.         int visiblePosition = mListView.getFirstVisiblePosition();  
  4.         //只有当要更新的view在可见的位置时才更新,不可见时,跳过不更新  
  5.         if (itemIndex - visiblePosition >= 0) {  
  6.             //得到要更新的item的view  
  7.             View view = mListView.getChildAt(itemIndex - visiblePosition);  
  8.             //从view中取得holder  
  9.             ViewHolder holder = (ViewHolder) view.getTag();  

  10.             HashMap<String, Object> item = data.get(itemIndex);  
  11.             //获取到具体的控件,
  12.             holder.name = (TextView) view.findViewById(R.id.name);  
  13.             holder.process = (ProcessBar) view.findViewById(R.id.process);  
  14.             .......
  15.             //对控件进行操作
  16.             holder.process.setMax(item.get("max"));
  17.             holder.process.setProgress(item.get("progress"));
  18.             ......
  19.      
  20.         }         
  21.     }  


0 2