Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中的Recyclerview中显示下载进度_Android_Android Recyclerview_Android Asynctask_Android Download Manager - Fatal编程技术网

在Android中的Recyclerview中显示下载进度

在Android中的Recyclerview中显示下载进度,android,android-recyclerview,android-asynctask,android-download-manager,Android,Android Recyclerview,Android Asynctask,Android Download Manager,我目前正在开发一个可以下载视频文件的应用程序。我使用下载管理器下载文件,一切正常,因为文件下载正常,我可以在我的通知中看到下载进度。现在我想在另一个类(包含recyclerview)中显示下载文件的进度。那么我应该如何实现这个模块呢 String urlDownload = mUrl; String filename = mUrl.substring(mUrl.lastIndexOf('/') + 1); Log.i("onLoadResource()", "

我目前正在开发一个可以下载视频文件的应用程序。我使用下载管理器下载文件,一切正常,因为文件下载正常,我可以在我的通知中看到下载进度。现在我想在另一个类(包含recyclerview)中显示下载文件的进度。那么我应该如何实现这个模块呢

  String urlDownload = mUrl;
        String filename = mUrl.substring(mUrl.lastIndexOf('/') + 1);
        Log.i("onLoadResource()", "url = " + mUrl + "\n" + filename);
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(urlDownload));

    request.setDescription("Testando");
    request.setTitle("Download");
    request.allowScanningByMediaScanner();
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename);

    final DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);

    final long downloadId = manager.enqueue(request);

    final ProgressBar mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);

    new Thread(new Runnable() {

        @Override
        public void run() {

            boolean downloading = true;

            while (downloading) {

                DownloadManager.Query q = new DownloadManager.Query();
                q.setFilterById(downloadId);

                Cursor cursor = manager.query(q);
                cursor.moveToFirst();
                int bytes_downloaded = cursor.getInt(cursor
                        .getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
                int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));

                if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) {
                    downloading = false;
                }

                final int dl_progress = (int) ((double)bytes_downloaded / (double)bytes_total * 100f);

                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {

                        mProgressBar.setProgress((int) dl_progress);

                    }
                });


                cursor.close();
            }

        }
    }).start();
}

这里有一些一般性的建议

您可以通过调用notifyItemRangeChanged(int positionStart、int itemCount、Object payload)更新
RecyclerView
行。这将在适配器中调用
onBindViewHolder(FeedBaseViewHolder,int-position,List-payloads)
,您可以在适配器中使用进度条更新行

在有效负载中,您可以将所需的值透视图与您的需求一起传递,如启动进度操作、更新进度、停止进度


我希望这对您有所帮助。

在您为每个RecycleServiceItem使用的数据模型中维护一个进度变量。当收到进度更新时,更新正在使用的数据集,并在调用
notifyItemChanged(mPos)
notifyItemRangeChanged()
后通知适配器
notifyItemChanged(mPos)
触发相应位置的
onBindVieHolder
,即使它当前不可见

只需向该类广播下载百分比。。并在该活动中更新recycler的进度栏好的,我理解,谢谢,但如何在recyclerview适配器中添加多个文件请给我一些指导如何在该类中设置下载百分比广播请给我指导1.5年来我一直在处理这个问题。StackOverflow中没有人回答这个问题。甚至,谷歌也帮不了我,我也被困在同样的问题上。你解决了这个问题吗?