使用Otto在RecyclerViewAdapter中更新一个项目

时间:2016-05-24 02:48:42

标签: android android-recyclerview otto

我正在使用DownloadManager下载文件,并希望在每次下载时更新RecyclerView.ViewHolder中的进度视图。

我目前的想法是使用Otto发布downloadProgressed事件。我希望我的viewHolders在事件总线中注册,但我不知道我应该在哪里注册和取消注册。

这是个好主意吗?或者我应该寻找更好的解决方案吗?

2 个答案:

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

如果您担心表现。

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

  2. 衡量您的表现问题。

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