按下 RecyclerView 中的按钮时如何下载文件?

How to download a file when a button inside a RecyclerView is pressed?

我正在创建一个应用程序,其中有一个按钮,当按下该按钮时,它将开始下载文件。该按钮位于 RecyclerView 上,我正在使用库存 Android 下载管理器。

我尝试在我的 Recycler View 适配器上 onBindViewHolder 内的那个按钮上做一个 setOnClickListener 并在其中包含函数的内容:

holder.button.setOnClickListener {
    val request = DownloadManager.Request(Uri.parse(downloadurl))
    request.setTitle("$downloadname.apk")
    request.setDescription("Download")
    request.setVisibleInDownloadsUi(true)
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS)
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
    val manager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
    manager.enqueue(request)
}

但在 getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager 中说我需要 Context 而不是 String

然后我尝试创建一个具有下载功能的对象,但它给了我与该功能相同的错误。

如何在对象或 setOnClickListener 中实现该功能?

该错误消息是由于未传递预期的目标文件名引起的:

request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename);

并且您需要按照方法 getSystemService() 的要求获取 Context 的句柄:

@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int position) {

    final SomeClass item = getItem(position);

    ((ViewHolder) viewHolder).getDataBinding().buttonDownload.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Context context = ((ViewHolder) viewHolder).mRecyclerView.getContext();
            DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);

            DownloadManager.Request request = new DownloadManager.Request(Uri.parse(item.getDownloadUrl()));
            request.setTitle(item.getTitle());
            request.setDescription(item.getDescription());
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, item.getFileName());
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            request.setVisibleInDownloadsUi(true);
            manager.enqueue(request);
        }
    });
}

自己随意将其从 Java 转换为 Kotlin(将代码粘贴到 .kt 时会询问)。