android - notifyItemChanged() 与 findViewHolderForAdapterPosition

标签 android android-recyclerview

我正在使用后台服务下载一些文件并更新 RecyclerView 中的进度。 当进度更改时,服务将使用回调到 Activity ,其中项目随进度更改。 我想知道哪一个在性能方面更好?

所以我必须像这样使用 findViewHolderForAdapterPosition(position);

@Override
    public void onProgressUpdate(String id, int pos, int progress) {
      MyViewHolder vh = recyclerView.findViewHolderForAdapterPosition(pos);
      vh.progressBar.setProgress(progress);
}

@Override
    public void onProgressUpdate(String id, int pos, int progress) {
     adapter.getProgressHashmap().put(id, progress);
     adapter.notifyItemChanged(pos);
}

在我的适配器中,我有一个 Hashmap

HashMap<String, Integer> progressHashmap = new HashMap<>();

现在,在 onBindViewHolder 中 我将检查 hashmap 是否包含 id 然后更新 ProgressBar

 if (progressHashmap.containsKey(id)) {
        int progress = progressHashmap.get(id);
        holder.progressBar.setProgress(progress);
    }

最佳答案

我也想知道更多。

根据我的经验,使用 findViewHolderForAdapterPosition(int position) 获取 ViewHolder并且仅更新您需要更新的数据比调用 notifyItemChanged(int position) 更有效,因为后者会使整个 View 无效并重绘。

另一种方法是调用 notifyItemChanged(int position, Object payload) , 通过 progress作为负载并处理 onBindViewHolder(VH holder, int position, List<Object> payloads) 中的进度更新.如果您愿意,我可以为您提供有关如何执行此操作的更多信息。

我不知道这些方法中哪一种最安全,但如果非要我猜的话,那应该是后者,因为 findViewHolderForAdapterPosition返回 null如果 RecyclerView 正在计算其布局。

关于android - notifyItemChanged() 与 findViewHolderForAdapterPosition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48096362/

相关文章:

java - 搜索适配器 onbind 方法中的 IndexOutofBounexception?

java - gradle同步时sun.security.validator.ValidatorException

android - 为什么对 RecyclerView.ViewHolder 使用静态

java - Recyclerview 中已经设置了 OnFlingListener 的一个实例

java - 此版本的 sql server 不支持对数据库和/或服务器名称的引用

java - 启动时清空 RecyclerView,然后通过 onclick 监听器在其上添加项目

java - 如何创建数组列表,其中一个参数将等于另一个数组的参数

android - 调用需要 API 级别 21(当前最小值为 17): android. hardware.camera2.CameraDevice.StateCallback

android - "Upstream Google Cloud Messaging and User Notifications Sign-up"是强制性的吗?

java - 在android中执行方法之前获取计数