2

我在使用 DiffResult 刷新嵌套的 recyclerview 时遇到问题。我有一个父母名单,每个父母都有孩子名单。当我想刷新整个列表时,我计算父母列表的 DiffResult 和每个父母的孩子的 DiffResult。

class Child {
  String id;
  String name;
  boolean highlighted;
}

class Parent {
  String id;
  String name;
  List<Child> children;
  DiffUtil.DiffResult result;
}

当然,我将结果分派给每个适配器、绑定项目等。但是为每个子视图呈现正确的状态存在问题。

例如:第 1 步(未突出显示):

{
  parents: {
    "0": {
      "name": "parent1",
      "children": {
        "0": {
           "name": "child1",
           "highlighted": false,
        },
        "1": {
           "name": "child1",
           "highlighted": false,
        }
      }
    }
  }
}

屏幕上的结果:

<RecyclerView>
  <ParentView>
    <RecyclerView>
      <ChildView/> //not highlighted
      <ChildView/> //not highlighted
    </RecyclerView/>
  </ParentView/>
</RecyclerView>

没关系。

第 2 步(仅突出显示第一个孩子):

{
  parents: {
    "0": {  //areItemsTheSame: true, areContentsTheSame: false
      "name": "parent1",
      "children": {
        "0": { //areItemsTheSame: true, areContentsTheSame: false
           "name": "child1",
           "highlighted": true, //changed
        },
        "1": { //areItemsTheSame: true, areContentsTheSame: true
           "name": "child1",
           "highlighted": false,
        }
      }
    }
  }
}

屏幕上的结果(仅突出显示第一个子视图):

<RecyclerView>
  <ParentView>
    <RecyclerView>
      <ChildView/> //highlighted
      <ChildView/> //not highlighted
    </RecyclerView/>
  </ParentView/>
</RecyclerView>

没关系。但第 3 步(均突出显示):

{
  parents: {
    "0": {  //areItemsTheSame: true, areContentsTheSame: false
      "name": "parent1",
      "children": {
        "0": { //areItemsTheSame: true, areContentsTheSame: true
           "name": "child1",
           "highlighted": true,
        },
        "1": { //areItemsTheSame: true, areContentsTheSame: false
           "name": "child1",
           "highlighted": true, //changed
        }
      }
    }
  }
}

屏幕上的结果(BUG:仅突出显示第二个孩子!):

<RecyclerView>
  <ParentView>
    <RecyclerView>
      <ChildView/> //not highlighted
      <ChildView/> //highlighted
    </RecyclerView/>
  </ParentView/>
</RecyclerView>

RecyclerView“重置”所有视图并仅为第二个孩子呈现“突出显示”视图。

但是:我可以避免这种行为,并在我设置parentRecyclerView.setItemAnimator(null)childRecyclerView.setItemAnimator(null).

怎么了?

4

0 回答 0