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

  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("点击下载");
                                        }
                                    }
                                }
                            }
                        });
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值