2016-04-02 23 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

我认为这是另一个问题本身,可能需要一个新的问题与更多的背景信息才能得到正确的答案。一个快速的想法是,它看起来像你在后台使用服务下载,你只能有一个类型的服务同时运行,所以如果你已经下载了一些东西,并且你没有在内部处理排队该服务将失败。再次,这只是一个猜测,因为我不知道其余的代码。 –