我在用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)
时,我可以避免这种行为并使它正常工作。
怎么了?