notifyItemChanged()vs findViewHolderForAdapterPosition

时间:2018-01-04 13:27:25

标签: android android-recyclerview

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

所以我必须使用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);
    }

1 个答案:

答案 0 :(得分:0)

我也想了解更多相关信息。

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

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

我不知道哪种方法最安全,但如果我不得不猜测后者是因为findViewHolderForAdapterPosition如果RecyclerView正在计算其布局,则返回null