2016-04-02 39 views
2

我有一個GridView單元格包含一個書名和一個下載按鈕。我希望下載按鈕消失,並在按下該按鈕時顯示進度條。與此同時,我開始下載文件,並希望在下載更新時更新進度欄。最後,當下載完成時,我想隱藏進度條並顯示一個按鈕。如何正確更新GridView中的進度條?

我這個結構是自己創建一個自定義適配器,用下面的方法getView方式:

public View getView(final int position, View convertView, ViewGroup parent) { 
      final RelativeLayout card; 
      if (convertView == null) { 
       card = (RelativeLayout) getLayoutInflater().inflate(R.layout.book_cover, null); 
      } else { 
       card = (RelativeLayout) convertView; 
      } 
      TextView bookName = (TextView) card.findViewById(R.id.textView_bookName); 
      final MNBook currentBook = getItem(position); 
      bookName.setText((String) currentBook.getTitle()); 
      final Button downloadBookButton = (Button) card.findViewById(R.id.button_download_book); 
      final Button readBookButton = (Button) card.findViewById(R.id.button_read_book); 
      final ProgressBar progressBar = (ProgressBar) card.findViewById(R.id.progressbar_book_download); 
      downloadBookButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        downloadFile(currentBook, progressBar, 
          downloadBookButton, readBookButton); 
       } 
      }); 
      if (currentBook.isBooleanDownloaded()) { 
       downloadBookButton.setVisibility(View.GONE); 
       readBookButton.setVisibility(View.VISIBLE); 
       progressBar.setVisibility(View.GONE); 
      } 
      return card; 
     } 

用下面的方法downloadFile

private void downloadFile(MNBook book, final ProgressBar progressBar, 
           final Button downloadButton, final Button readButton) { 
     final MNBook localBook = book; 
     String fileName = book.getFileName(); 
     String url = book.getURL(); 
     Intent intent = new Intent(this, DownloadService.class); 
     intent.putExtra("url", url); 
     intent.putExtra("file_name", fileName); 
     intent.putExtra("receiver", new ResultReceiver(new Handler()) { 
      @Override 
      protected void onReceiveResult(int resultCode, Bundle resultData) { 
       super.onReceiveResult(resultCode, resultData); 
       if (resultCode == DownloadService.UPDATE_PROGRESS) { 
        int progress = resultData.getInt("progress"); 
        progressBar.setProgress(progress); 
        if (progress == 100) { 
         progressBar.setVisibility(View.GONE); 
         readButton.setVisibility(View.VISIBLE); 
         setDownloadedBookStatus(localBook); 
        } 
       } 
      } 
     }); 
     downloadButton.setVisibility(View.GONE); 
     progressBar.setVisibility(View.VISIBLE); 
     startService(intent); 

    } 

我有問題這種方法是進度條跳​​轉到其他單元格。基本上,如果我在一本書上點擊下載並向下滾動,則進度會出現在不同的書中。

我想知道如何解決此問題。如果有另一種方法來設置我的代碼,對我來說沒關係。

回答

0

你experienceing的問題是,當你的Android滾動如何處理的意見(上/ R/androidquestions交帳)。假設您有物品A,B和C.如果您開始在物品A上下載,則會發送物品A當前正在使用的視圖的參考信息以顯示。 雖然當您開始滾動並且現在顯示項目C時,問題在於Android將重新使用這些視圖,並且這些視圖現在用於顯示項目C.

這樣做的一種方法是將下載進度存儲在MSBook對象。所以當Android顯示的項目你獲取的百分比,然後你用這個數額填充進度條。

當下載進度增加時,您還需要告訴Android更新列表ui,以便看到新的進度欄的值。這是通過notifyDataSetChanged()完成的。 (最好是與該項目的位置以及更有效率,有文檔中快速瀏覽一下:))

所以這樣的事情應該讓你開始:

private void downloadFile(MNBook book) { 
     final MNBook localBook = book; 
     String fileName = book.getFileName(); 
     String url = book.getURL(); 
     Intent intent = new Intent(this, DownloadService.class); 
     intent.putExtra("url", url); 
     intent.putExtra("file_name", fileName); 
     intent.putExtra("receiver", new ResultReceiver(new Handler()) { 
      @Override 
      protected void onReceiveResult(int resultCode, Bundle resultData) { 
       super.onReceiveResult(resultCode, resultData); 
       if (resultCode == DownloadService.UPDATE_PROGRESS) { 
        int progress = resultData.getInt("progress"); 
        localBook.setProgress(progrss); 
        notifyDataSetChanged(); 
        } 
       } 
      } 
     }); 
     startService(intent); 
    } 

現在當你調用notifyDataSetChanged ()Android會再次調用getView(),並且由於您更新了進度,您將在那裏處理所有與視圖有關的部分。

所以在getView你現在有與此相關的代碼:

if (progress == 100) { 
    progressBar.setVisibility(View.GONE); 
    readButton.setVisibility(View.VISIBLE); 
    setDownloadedBookStatus(localBook); 
} 

希望幫助你出來一下。

+0

每次我更新進度時,都會調用'notifyDataSetChanged()'的結果,我注意到我不能再觸發新的下載。如果我嘗試按下下載按鈕而另一個正在下載,那麼我沒有得到任何迴應。由於我可以自由滾動,因此應用程序本身仍然可以響應,因此我下載了一些內容。你知道解決這個問題的方法嗎? – maesydy

+0

我認爲這是另一個問題本身,可能需要一個新的問題與更多的背景信息才能得到正確的答案。一個快速的想法是,它看起來像你在後臺使用服務下載,你只能有一個類型的服務同時運行,所以如果你已經下載了一些東西,並且你沒有在內部處理排隊該服務將失敗。再次,這只是一個猜測,因爲我不知道其餘的代碼。 –