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

来源:互联网 发布:学php以后可以做什么 编辑:程序博客网 时间:2024/06/10 16:51
  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("点击下载");                                        }                                    }                                }                            }                        });
0 0
原创粉丝点击