如何正确更新GridView中的进度条?

时间:2016-04-02 18:26:26

标签: android android-layout gridview mobile

我有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上交叉发布)

1 个答案:

答案 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);
}

希望能帮到你一点。