Listview 更新单个Item布局 和 listview.getLastVisiblePosition()=-1 问题的解决

848 阅读1分钟

前言

开始CSDN 和 简书文章搬家行动

  1. 遇到的一个问题 :项目中下载文件部分。在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;
				}
			}
		};
	};
  1. 第一个问题解决后又发生了第二个问题(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("点击下载");
                }
            }
        }
    }
});