方法:
要实现listview上进度条动态更新,一般我们可以采用2种方法:
1. 获得itemview对象,再获得其中的进度条等对象对其重新赋值
2. 通过更新数据源,再调用adapter的notifyDataSetChanged 方法
优劣:
第一种:能定位到item来更新。但是Adapter中的itemview是采用重用的方法,假如一个listview中一次能显示5个item,那么第6个item其实在重用第一个item,这样获得获得的itemview对象并不准确。
第二种:更新数据源,通过数据源中position下标与getView中的下标绑定,这样更新数据就能准确到指定的item。但是频繁调用getView方法,容易造成ui阻塞.
结合:
1. 拿到需要更新的数据源下表pos
2. 判断pos是否在listview的显示中
3. 在显示中则获得itemView对象
4. 更新对应的itemview对象数据
代码:
1.获得pos是否在显示的listview中 , 及更新数据
int firstVisibleRow = listview.getFirstVisiblePosition() -1;
int lasVisibleRow = listview.getLastVisiblePosition();
if(pos >= firstVisibleRow && pos<= lasVisibleRow){
View view = (View) listview.getChildAt(pos - firstVisibleRow);
ViewHolder holder = new ViewHolder();
holder.progressBar = (ProgressBar) view.findViewById(R.id.downloadPro_list_item);
holder.percentTv = (TextView)view.findViewById(R.id.percentTv_list_item);
holder.downloadImgBn = (ImageButton)view.findViewById(R.id.download_list_item);
holder.svvdTv = (TextView)view.findViewById(R.id.cargo_operation_list_svvd);
holder.portTv =(TextView)view.findViewById(R.id.cargo_operation_list_port);
holder.terminalTv = (TextView)view.findViewById(R.id.cargo_operation_list_terminal);
holder.etaTv = (TextView)view.findViewById(R.id.cargo_operation_list_eta);
updateUI(downloadInfo , holder );
}
优化:
1.可以通过修改发送handler的频率来进行优化
if(mesenger != null ){
try {
if((System.currentTimeMillis() - lastUpdatedTime > SEND_UPDATE_TIME)
|| per >=100 || error!= NO_ERROR){
downloadInfo.setPer(getPer());
downloadInfo.setError(getError());
Message msg = Message.obtain();
msg.what = CargoOperationDownloadAdapter.UPDATE_UI;
Bundle bundle = new Bundle();
bundle.putSerializable("DownloadInfo" , downloadInfo);
msg.setData(bundle);
mesenger.send(msg);
lastUpdatedTime = System.currentTimeMillis();
}
} catch (RemoteException e) {
e.printStackTrace();
}
}