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