RecyclerView StaggeredGridLayoutManager réorganisation de problème

J'essaie d'afficher trois (au moins c'est le cas, j'ai un problème avec) des éléments dans un RecyclerView avec un StaggeredGridLayoutManager avec deux colonnes. Le premier élément est fractionné sur les deux lignes. Voici à quoi ça ressemble:

RecyclerView StaggeredGridLayoutManager réorganisation de problème

Maintenant, je suis en déplaçant l'élément "Item 2" de haut. Voici le code que j'appelle, dans la carte (c'est un exemple que j'ai écrit pour démontrer le problème que j'ai plus de complexité du projet):

private int findById(int id) {
    for (int i = 0; i < items.size(); ++i) {
        if (items.get(i).title.equals("Item " + id)) {
            return i;
        }
    }

    return -1;
}

//Moving the item "Item 2" with id = 2 and position = 0
public void moveItem(int id, int position) {
    final int idx = findById(id);
    final Item item = items.get(idx);

    if (position != idx) {
        items.remove(idx);
        items.add(position, item);
        notifyItemMoved(idx, position);
        //notifyDataSetChanged();
    }
}

Après, le tableau est très bien: [Item 2, Item 1, Item 3]. Cependant, le point de vue est loin d'amende:

RecyclerView StaggeredGridLayoutManager réorganisation de problème

Si je touche le RecyclerView (assez pour déclencher la overscroll effet si il n'y a pas assez d'éléments pour faire défiler), Point 2 se déplacer vers la gauche, là où je m'attendais à le voir en premier lieu (avec une belle animation):

RecyclerView StaggeredGridLayoutManager réorganisation de problème

Comme vous l'avez peut-être vu dans le code, j'ai essayé de remplacer notifyItemMoved(idx, position) par un appel à notifyDataSetChanged(). Il fonctionne, mais le changement n'est pas animé.

J'ai écrit un échantillon complet pour le démontrer et de le mettre sur GitHub. Il est presque minime (il y a des options pour déplacer l'élément à bascule et leur répartition).

Je ne vois pas ce que je peux faire de mal. Est-ce un bug avec StaggeredGridLayoutManager? Je voudrais éviter notifyDataSetChanged() que je tiens à garder une cohérence concernant les animations.


Edit: après quelques recherches, il n'est pas nécessaire pour un fractionné élément pour montrer le problème. J'ai enlevé la pleine échelle. Lorsque j'essaie de déplacer l'Élément 2 à la position 0, il ne bouge pas: Article 1 va après elle, et le Point 3 est déplacé sur la droite, j'ai donc: cellule vide, Point 2, de la nouvelle ligne, l'Article 1, Point 3. J'ai toujours la correcte mise en page après un parchemin.

Ce qui est plus intéressant, c'est que je n'ai pas de problème avec un GridLayoutManager. J'ai besoin d'une pleine échelle de l'élément de sorte qu'il n'est pas une solution, mais je suppose que c'est effectivement un bug dans le StaggeredGridLayoutManager...

Je ne sais pas si c'est un bug ou pas mais j'ai vu cela aussi, les choses semblent seulement se déplacer lorsque vous faites défiler et le gap strategy est cochée
GAP_HANDLING_NONE évite le déplacement d'éléments, mais j'ai toujours une mauvaise disposition. GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS est probablement le défaut, de toute façon, j'ai le même comportement avec lui que sans préciser quoi que ce soit.
Oui je sais je dis juste que, après vous faites défiler la carte vérifie les lacunes et puis déplace les choses à la bonne place

OriginalL'auteur Marc Plano-Lesay | 2015-01-06