如何使用 Firebase 和 RecyclerView 管理多个下载



我有一个RecyclerViewFirebaseRecyclerAdapter物品。每个项目都引用了Firebase存储中的一些文件。每个项目都有下载按钮。我使用storageReference.getFile(location)从 Firebase 存储下载文件。 当我单击下载按钮并等待下载完成时,选中的图标(绿色图标)在特定位置正确显示。

我的问题是当我同时下载多个项目时(当我单击多个项目时),绿色图标不会显示在每个项目的适当位置。

如何同时管理每个项目的多个下载,以便在特定项目下载完成后可以在特定位置显示绿色图标?

下载按钮后面OnBindViewHolder的代码。

holder.imgDocumentChecker.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
holder.imgDocumentChecker.setVisibility(View.GONE);
holder.txtProgress.setVisibility(View.VISIBLE);
holder.progressBar.setVisibility(View.VISIBLE);
final Document item = getItem(holder.getAdapterPosition());
final File parent = fileHelper.parentFolderGenerator(item);
counter = 0;
if (item.getFirebaseStorageFiles() != null && !item.getFirebaseStorageFiles().isEmpty()) {
if (parent.listFiles() == null) {
final String[] files = item.getFirebaseStorageFiles().split("____");
if (files != null && files.length > 0) {
for (int i = 0; i < files.length; i++) {
String fileName = files[i].substring(files[i].lastIndexOf("/") + 1);
String storageFileUrl = Constants.ROOT_FIREBASE_STORAGE_URL + item.getDocFolder() + File.separator + files[i];
if (!parent.exists()) {
parent.mkdirs();
}
File localFile = new File(parent, fileName);
StorageReference storageReference = storage.getReferenceFromUrl(storageFileUrl);
storageReference.getFile(localFile)
.addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
counter++;
int valeur = (100 / files.length) * counter;
holder.progressBar.setProgress(valeur);
holder.txtProgress.setText(valeur + "");
Log.d("progressvalues:",  "valeur:"+valeur+"|counter:"+counter+"|lengh:"+files.length);
if (counter == files.length) {
holder.txtProgress.setVisibility(View.GONE);
holder.progressBar.setVisibility(View.GONE);
holder.imgDocumentChecker.setVisibility(View.VISIBLE);
holder.imgDocumentChecker.setImageResource(R.drawable.done_ic);
}
}
}).addOnProgressListener(new OnProgressListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onProgress(FileDownloadTask.TaskSnapshot taskSnapshot) {
double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
holder.txtProgress.setVisibility(View.GONE);
holder.progressBar.setVisibility(View.GONE);
}
});
}
}
} else {
startDocumentContentActivity(item, getRef(position));
}
}
}
});

请帮忙。

就像评论中提到的,这个请求不应该在RecyclerView.Adapter中完成,也绝对不应该onBindViewHolder中提出。

你应该把它抽象到一个单独的类,一个Presenter或框架自己的ViewModel,话虽如此:

发出该请求并输入新数据后,您应该更新适配器的数据model并通知这些更改。

报告点击(最终会触发请求)应通过一个界面来完成,您可以在其中获得Adapter

public interface Listener {
void onItemClicked(YourModelPojo item);
}

而你的活动/片段/演示器,无论你想做什么抽象,都会实现这个侦听器接口。

所以你的适配器的

holder.imgDocumentChecker.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
// Update the UI the request is being made and report to listener
listener.onItemClicked(data.get(getAdapterPosition()));
}

然后,适配器还应在适配器的数据上具有更新项,并通知此更改。由于您的模型更改了您的bindViewHolder因此会正确更新 UI。

当然,您必须实现这些UI更改(数据下载/更新/等)


我写了一些你可以依赖的文章(使用开源代码):

  • 使用 Android 的 ViewModel - MVVM

  • 使用演示器 - 模型视图演示器

相关内容

  • 没有找到相关文章

最新更新