Listviewは単一のItemレイアウトとlistviewを更新する.getLastVisiblePosition()=-1問題の解決


  • で発生した問題:プロジェクトのダウンロードファイルセクション.進捗バーは、ListViewで個別に更新されます.エラー:adapterを試用できません.notifyDataSetChanged(); この方法ではすべてのListViewが更新されるため,プログラムカードが死にやすく,悪いユーザ体験が生じる.正しい:まずクリック位置を取得し、クリック位置がListViewの個数を探していない後、最も重要なステップは、getChildAt(int position)メソッドでpositionが前に見える領域のいくつかの要素を指すため、クリック位置からListViewが画面に表示される最初のitemの位置を減算することである.詳細コード:
  •  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の問題解決後に第2の問題(listview.getLastVisiblePosition()=-1の場合)が発生した原因:ListView.getLastVisiblePosition()メソッドの場合、ListViewはロード完了していません.解決方法:ListView.Post(new Runnable()); Runnableでコードの更新を行います.

  • コード:
    lvDownLoad.post(new Runnable() {
                                @Override
                                public void run() {
                                    for(int i=0;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("    ");
                                            }
                                        }
                                    }
                                }
                            });