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

时间:2018-12-20 23:52:06

标签: android kotlin android-recyclerview android-download-manager

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

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

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中起作用?

1 个答案:

答案 0 :(得分:1)

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

request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename);

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

@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时会询问)。