- 遇到的一个问题 :项目中下载文件部分。在ListView 中单独更新一个进度条。
错误: 不能试用 adapter.notifyDataSetChanged(); 因为此方法会更新全部 ListView,很容易导致程序卡死,产生不好的用户体验。
正确:首先获取点击位置 ,在点击位置没有找过 ListView 的个数 之后,最重要的一步就是让点击位置 减去 ListView 在屏幕中显示的首个item的位置 ,因为:getChildAt ( int position ) 方法中position指的是当前可见区域的第几个元素。
详细代码:
private Handler downHandler = new Handler(){
public void handleMessage(Message msg) {
if(clickPosition>=lvDownLoad.getFirstVisiblePosition() &&
clickPosition <= lvDownLoad.getLastVisiblePosition()) {
int positionInListView = clickPosition - lvDownLoad.getFirstVisiblePosition();
ProgressBar pb = (ProgressBar) lvDownLoad.getChildAt(positionInListView)
.findViewById(R.id.pb_download);
TextView tv = (TextView) lvDownLoad.getChildAt(positionInListView)
.findViewById(R.id.tv_download_state);
switch (msg.what) {
case 0: // 设置最大 进度条 刻度
pb.setVisibility(View.VISIBLE);
tv.setText("开始下载");
break;
case 1: // 更新进度条
pb.setProgress((int)(downLoadFileSize/fileSize*100));
break;
case 2: // 通知下载完成
pb.setVisibility(View.INVISIBLE);
tv.setText("查看文件");
break;
}
}
};
};
- 第一个问题解决后又发生了第二个问题(listview.getLastVisiblePosition()=-1的情况)
原因:由于ListView.getLastVisiblePosition() 方法的时候,ListView 并没有加载完成。
解决方法:通过ListView .Post(new Runnable()); 在Runnable 中进行代码的 更新。
代码:
lvDownLoad.post(new Runnable() {
@Override
public void run() {
for(int i=0;i<files.size();i++){
if(i >= lvDownLoad.getFirstVisiblePosition() &&
i <= lvDownLoad.getLastVisiblePosition()){
int ii = i - lvDownLoad.getFirstVisiblePosition();
ProgressBar pb = (ProgressBar)lvDownLoad.getChildAt(ii)
.findViewById(R.id.pb_download);
TextView tv = (TextView) lvDownLoad.getChildAt(ii)
.findViewById(R.id.tv_download_state);
if(GetFileSizeUtil.fileIsExists( // 有相同文件
Environment.getExternalStorageDirectory().getPath()
+"/zcdownloadFile/"+files.get(i).getFileName())){
pb.setVisibility(View.INVISIBLE);
tv.setText("查看文件");
}else{ // 没有相同文件
pb.setVisibility(View.VISIBLE);
tv.setText("点击下载");
}
}
}
}
});