У меня возникла проблема с обновлением вложенного просмотра переработчика с помощью DiffResult. У меня есть список родителей, и у каждого родителя есть список детей. Когда я хочу обновить весь список, тогда я вычисляю 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)
.
Что не так?