使用 Otto 更新 RecyclerView Adapter 中的一项
Update One Item in RecyclerViewAdapter with Otto
我正在使用 DownloadManager 下载文件,并希望在 RecyclerView.ViewHolder 中为每次下载更新进度视图。
我目前的想法是使用 Otto 来 post downloadProgressed 事件。我希望我的 viewHolders 在事件总线中注册,但我不确定我应该在哪里注册和取消注册。
这是个好主意吗?或者我应该寻找更好的解决方案?
您可以在 fragment/activity 中注册事件总线并通过函数将事件传递给您的适配器。
您在 fragment/activity 中的订阅者将如下所示
@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
}
您不应绑定 ViewHolder。 ViewHolder 的目的是将适配器中的数据绑定到视图。您应该更新适配器中的数据并调用 notifyItemChanged(index)
。除非您 运行 遇到可衡量的性能问题,否则您很可能不应该担心性能。
如果您担心性能。
首先实现一个干净的解决方案(过早优化非常非常糟糕)。
衡量您的表现问题。
优化(例如在适配器中缓存每次下载的索引)并将性能与您的测量值进行比较。
我正在使用 DownloadManager 下载文件,并希望在 RecyclerView.ViewHolder 中为每次下载更新进度视图。
我目前的想法是使用 Otto 来 post downloadProgressed 事件。我希望我的 viewHolders 在事件总线中注册,但我不确定我应该在哪里注册和取消注册。
这是个好主意吗?或者我应该寻找更好的解决方案?
您可以在 fragment/activity 中注册事件总线并通过函数将事件传递给您的适配器。
您在 fragment/activity 中的订阅者将如下所示
@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
}
您不应绑定 ViewHolder。 ViewHolder 的目的是将适配器中的数据绑定到视图。您应该更新适配器中的数据并调用 notifyItemChanged(index)
。除非您 运行 遇到可衡量的性能问题,否则您很可能不应该担心性能。
如果您担心性能。
首先实现一个干净的解决方案(过早优化非常非常糟糕)。
衡量您的表现问题。
优化(例如在适配器中缓存每次下载的索引)并将性能与您的测量值进行比较。