findViewHolderForAdapterPosition

findViewHolderForAdapterPosition

我正在使用后台服务下载一些文件并更新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内部
我将检查哈希图是否包含ID,然后更新ProgressBar

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

最佳答案

我也想更多地了解这一点。

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

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

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

10-07 12:28