我正在使用后台服务下载一些文件并更新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
。