Я пытаюсь отобразить три (по крайней мере, это тот случай, когда у меня проблема), в RecyclerView
с StaggeredGridLayoutManager
с двумя столбцами. Первый элемент охватывает две строки. Вот как это выглядит:RecyclerView StaggeredGridLayoutManager проблема переупорядочения
Теперь я двигаюсь пункт «Пункт 2» в верхней части. Вот код, который я называю, в адаптере (это образец я написал, чтобы продемонстрировать вопрос, который я имею в более сложном проекте):
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();
}
}
После этого массив прекрасно: [Item 2, Item 1, Item 3]
. Тем не менее, точка зрения далека от штрафа:
Если я коснуться RecyclerView
(достаточно, чтобы вызвать overscroll эффект, если не хватает элементов для прокрутки), Пункт 2 шага влево, где я ожидал увидеть ее в первую очередь (с хорошей анимацией):
Как вы, возможно, видели в коде, я попытался заменить notifyItemMoved(idx, position)
вызовом notifyDataSetChanged()
. Он работает, но изменение не анимируется.
Я написал полный образец, чтобы продемонстрировать это и положил его на GitHub. Это почти минимально (есть опции для перемещения элемента и переключения их охвата).
Я не вижу, что я могу делать неправильно. Это ошибка с StaggeredGridLayoutManager
? Я хотел бы избежать notifyDataSetChanged()
, так как я хотел бы сохранить согласованность в отношении анимаций.
Редактировать: после некоторого копания нет необходимости в полностью настроенном элементе, чтобы показать проблему. Я удалил полный пролет. Когда я пытаюсь переместить пункт 2 в позицию 0, он не перемещается: Пункт 1 идет за ним, а элемент 3 перемещается вправо, поэтому у меня: пустая ячейка, позиция 2, новая строка, пункт 1, Пункт 3. У меня все еще есть правильный макет после свитка.
Что более интересно, так это то, что у меня нет проблемы с GridLayoutManager
. Мне нужен полный пробел, поэтому это не решение, но я думаю, что это действительно ошибка в StaggeredGridLayoutManager
...
Я не знаю, является ли это ошибкой или нет, но я тоже это видел, вещи только движутся, когда вы прокручиваете и проверяется «стратегия разрыва». – tyczj
@tyczj: 'GAP_HANDLING_NONE' избегает перемещаемых предметов, но я все еще получают неправильное расположение. 'GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS', вероятно, по умолчанию, во всяком случае, у меня такое же поведение, как и без указания чего-либо. –
Да, я знаю, что просто говорю, что после прокрутки адаптер проверяет пробелы, а затем перемещает вещи в нужное место. – tyczj