我正在使用DownloadManager下载文件,并希望在每次下载时更新RecyclerView.ViewHolder中的进度视图。
我目前的想法是使用Otto发布downloadProgressed事件。我希望我的viewHolders在事件总线中注册,但我不知道我应该在哪里注册和取消注册。
这是个好主意吗?或者我应该寻找更好的解决方案吗?
答案 0 :(得分:0)
您可以在片段/活动中注册事件总线,并通过函数将事件传递给适配器。
片段/活动中的子网格将如下所示
@Subscribe public void downloadEvent(DownloadEvent event){
adapter.updateDownloadState(event.getItemId(), event.getDownloadProgressPercentage());
}
适配器内部有这样的功能
public void updateDownloadState(int itemId, int progress){
Object obj = findItemWithId(itemId);
obj.setProgress(progress);
this.notifyDataSetChanged();
}
private Object findItemWithId(int itemId){
// code to find your object in the list eg. by iteration
}
答案 1 :(得分:0)
您不应绑定ViewHolders。 ViewHolder的目的是将适配器中的数据绑定到视图。您应该更新适配器中的数据并调用notifyItemChanged(index)
。除非您遇到可衡量的性能问题,否则您很可能不应该担心性能。
如果您担心表现。
首先实施一个干净的解决方案(过早优化非常糟糕)。
衡量您的表现问题。
优化(例如,缓存适配器中每个下载的索引),并将性能与测量值进行比较。