Не совсем ..
Псевдокласс класса
blockquote>:nth-child
соответствует элементу с + b -1 братья и сестры перед ним в дереве документов, для данного положительного или нулевого значения для n и имеет родительский элемент.Он является селектором и не сочетается с классами , В вашем правиле он просто должен удовлетворять обоим селекторам одновременно, поэтому он отображает строки таблицы
:nth-child(even)
, если они также имеют класс.row
.
Нет, это неправильно. Прежде всего, вы не можете ссылаться на позицию, переданную в onBindViewHolder после возврата этого метода. RecyclerView не перепривязывает вид при изменении его положения (из-за перемещения предметов и т. Д.).
Вместо этого вы можете использовать ViewHolder#getPosition()
, который вернет вам обновленную позицию.
Если вы это исправите, ваш код перемещения должен работать & amp; обеспечить хорошую анимацию.
Вызов notifyDataSetChanged
предотвратит предсказательную анимацию, поэтому избегайте ее как можно дольше. Подробности см. В документации .
Редактировать (из комментария): чтобы получить положение извне, возьмите держатель дочернего вида из списка переработчика, а затем получите положение из vh. См. RecyclerView API для деталей
Существует способ сохранить необычную анимацию с помощью всего лишь notifyDataSetChanged()
Вам нужно сделать свой собственный GridLayoutManager
с переопределенным методом supportsPredictiveItemAnimations()
, возвращая true
;
Вам нужно mAdapter.setHasStableIds(true)
Часть, которую я нахожу сложной, состоит в том, что вам нужно переопределить метод адаптера getItemId()
. Он должен возвращать значение, которое действительно уникально и не является прямой функцией position
. Что-то вроде mItems.get(position).hashCode()
В моем случае отлично работало - прекрасная анимация для добавления, удаления и перемещения элементов только с использованием notifyDataSetChanged()
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);
}
Я могу поддерживать сенсорную анимацию, добавив ее во внешний элемент моего списка
<View
android:foreground="?android:attr/selectableItemBackground"
...>
. Вы должны переместить свой метод на OnCreateViewHolder
, тогда notifyItemRemoved(index)
работает правильно.