按下 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
时会询问)。
我正在创建一个应用程序,其中有一个按钮,当按下该按钮时,它将开始下载文件。该按钮位于 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
时会询问)。