嵌套的RecyclerView + ItemDecorator + DiffUtil

时间:2019-06-28 21:30:50

标签: android android-recyclerview android-view android-viewholder android-diffutils

我在用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
        }
      }
    }
  }
}

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

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

RecyclerView仅重置第二个孩子的所有视图并仅渲染“突出​​显示”的视图。

但是:当我设置parentRecyclerView.setItemAnimator(null)childRecyclerView.setItemAnimator(null)时,我可以避免这种行为并使它正常工作。

怎么了?

0 个答案:

没有答案