【问题标题】:How to get correct RecyclerView ViewHolder after leaving the activity离开活动后如何获得正确的 RecyclerView ViewHolder
【发布时间】:2018-04-19 13:34:29
【问题描述】:

我有一个 recyclerview,我使用 firebaserecycleradapter 在上面填充数据。列表中的每个项目都包含对 Firebase 存储的引用。因此,当我单击下载按钮(红色按钮)时,下载开始,我可以获得有关视图的信息。当下载正在进行时,我离开活动并返回下载仍在进行中,但从未返回正确的项目视图。

当我回来时如何获得正确的项目视图,以便我可以显示特定项目的下载进度并在下载完成时对该特定项目进行一些更改。

下载按钮背后的代码

storageReference.getFile(zipFile)
                    .addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                            Log.d("visibilitedocSuccess", ""+holder+"|"+key+"|holder"+holder+"|holderid:"+holder.getAdapterPosition()+"|oldpos:"+holder.getOldPosition());

                                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();
                            Log.d("visibilitedocProgress:", progress + "% done"+"|holder"+holder+"|holderid:"+holder.getAdapterPosition()+"|oldpos:"+holder.getOldPosition());
                            holder.txtProgress.setText(((int) progress) + "%");
                            holder.progressBar.setProgress((int) progress);

                        }
                    }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.d("visibilitedocFail:", e + "");
                    holder.txtProgress.setVisibility(View.GONE);
                    holder.progressBar.setVisibility(View.GONE);
                    holder.imgDocumentChecker.setVisibility(View.VISIBLE);
                    holder.imgDocumentChecker.setImageResource(R.drawable.download_icon);
                    Toasty.error(DocumentsListActivity.this, "Chargement annulé", Toast.LENGTH_LONG, true).show();
                }
            });

Logcat 显示以下与 ViewHolder 相关的信息

ViewHolder{ace0130 position=-1 id=-1, oldPos=-1, pLpos:-1 unbound no parent}

请问如何解决?

【问题讨论】:

    标签: android android-recyclerview download firebaseui android-viewholder


    【解决方案1】:

    我不完全确定您所说的“获取正确的项目视图”是什么意思。但是,我从您的问题中了解到,我认为您遇到的问题来自您没有更新 UI。

    让我解释一下,每当您离开并返回正在下载的活动时,您都会“重新创建”RecyclerView。所以你不能访问以前显示的项目。

    这里有两个选择:

    • 要么保存你正在下载的东西的状态(你可以使用谷歌找到很多关于这方面的文章:))
    • 或者您的代码中有一些类可以在您返回下载活动时以这种方式保存信息,您只需更新视图项即可:)

    【讨论】:

    • 是的,我的问题来自于我离开并返回活动时没有正确更新 UI。非常感谢您的建议。
    • 好的!所以我所做的(我有类似的事情要做)是保存有关在模型类上下载元素的信息。这样,每当我回到活动时,我只需要从我的模型中获取数据并相应地更新 RecyclerView 项目:)。
    • 如果我只有这两个选择,我会按照你的第一个建议来解决。我将使用 EventBus 保存下载的视图和状态,然后当我回来时使用该视图更新 UI。
    猜你喜欢
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2016-07-18
    • 2016-05-07
    • 2019-12-19
    相关资源
    最近更新 更多