使用 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)。除非您 运行 遇到可衡量的性能问题,否则您很可能不应该担心性能。

如果您担心性能。

  1. 首先实现一个干净的解决方案(过早优化非常非常糟糕)。

  2. 衡量您的表现问题。

  3. 优化(例如在适配器中缓存每次下载的索引)并将性能与您的测量值进行比较。