我在使用 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)
.
怎么了?