Адаптер RecyclerView notifyDataSetChanged останавливает необычную анимацию

Не совсем ..

цитата из docs

Псевдокласс класса :nth-child соответствует элементу с + b -1 братья и сестры перед ним в дереве документов, для данного положительного или нулевого значения для n и имеет родительский элемент.

blockquote>

Он является селектором и не сочетается с классами , В вашем правиле он просто должен удовлетворять обоим селекторам одновременно, поэтому он отображает строки таблицы :nth-child(even), если они также имеют класс .row.

29
задан elgui 4 December 2014 в 17:58
поделиться

5 ответов

Нет, это неправильно. Прежде всего, вы не можете ссылаться на позицию, переданную в onBindViewHolder после возврата этого метода. RecyclerView не перепривязывает вид при изменении его положения (из-за перемещения предметов и т. Д.).

Вместо этого вы можете использовать ViewHolder#getPosition(), который вернет вам обновленную позицию.

Если вы это исправите, ваш код перемещения должен работать & amp; обеспечить хорошую анимацию.

Вызов notifyDataSetChanged предотвратит предсказательную анимацию, поэтому избегайте ее как можно дольше. Подробности см. В документации .

Редактировать (из комментария): чтобы получить положение извне, возьмите держатель дочернего вида из списка переработчика, а затем получите положение из vh. См. RecyclerView API для деталей

5
ответ дан elgui 4 December 2014 в 17:58
поделиться

Существует способ сохранить необычную анимацию с помощью всего лишь notifyDataSetChanged()

  1. Вам нужно сделать свой собственный GridLayoutManager с переопределенным методом supportsPredictiveItemAnimations(), возвращая true;

    ]
  2. Вам нужно mAdapter.setHasStableIds(true)

  3. Часть, которую я нахожу сложной, состоит в том, что вам нужно переопределить метод адаптера getItemId(). Он должен возвращать значение, которое действительно уникально и не является прямой функцией position. Что-то вроде mItems.get(position).hashCode()

В моем случае отлично работало - прекрасная анимация для добавления, удаления и перемещения элементов только с использованием notifyDataSetChanged()

105
ответ дан tochkov 4 December 2014 в 17:58
поделиться

1) Вы будете использовать notifyItemInserted(position); или notifyItemRemoved(position); вместо notifyDataSetChanged() для анимации. 2) Вы можете просто вручную исправить вашу проблему - используя

public void move(int from, int to){
    Track track = mArray.remove(from);
    mArray.add(to, track);
    notifyItemMoved(from, to);
    ViewHolder fromHolder = (ViewHolder) mRecyclerView.findViewHolderForPosition(from);
    ViewHolder toHolder = (ViewHolder) mRecyclerView.findViewHolderForPosition(to);
    Tag fromTag = fromHolder.itemView.getTag();
    fromHolder.itemView.setTag(toHolder.itemView.getTag()); 
    toHolder.itemView.setTag(fromTag);

}
3
ответ дан Aleksandr M 4 December 2014 в 17:58
поделиться

Я могу поддерживать сенсорную анимацию, добавив ее во внешний элемент моего списка

<View
    android:foreground="?android:attr/selectableItemBackground"
...>
.
0
ответ дан fix 4 December 2014 в 17:58
поделиться

Вы должны переместить свой метод на OnCreateViewHolder, тогда notifyItemRemoved(index) работает правильно.

0
ответ дан Dominik 4 December 2014 в 17:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: