Проблема с вложенным RecyclerView + ItemDecorator + DiffUtil - PullRequest
0 голосов
/ 29 июня 2019

У меня возникла проблема с обновлением вложенного просмотра переработчика с помощью 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).

Что не так?

...