我有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);
}
我采用这种方法的问题是进度条跳转到其他单元格。基本上,如果我在一本书上下载并向下滚动,则进度会显示在不同的书中。
我想知道如何解决这个问题。如果有另一种方法来设置我的代码,那对我来说没问题。
(在/ r / androidquestions上交叉发布)
答案 0 :(得分:0)
您遇到的问题是Android滚动时如何处理视图。假设您有项目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);
}
希望能帮到你一点。