Как отключить чертеж украшения элемента RecyclerView для продолжительности анимации элементов

У меня есть базовое украшение предметов, которое рисует какой-то материал в методе ItemDecoration.onDrawOver .

На этом RecyclerView также установлен DefaultItemAnimator . Анимации работают, все отлично. Кроме одного.

Когда все существующие элементы заменяются новым элементом, установленным в этом адаптере, декорации отображаются во время анимации.

Мне нужен способ скрыть их. Когда анимация заканчивается, их нужно показать, но пока она работает, они должны быть скрыты.

Я попробовал следующее:

 public void onDrawOver(..., RecyclerView.State state) { if(state.willRunPredictiveAnimations() || state.willRunSimpleAnimations()) { return; } // else do drawing stuff here } 

Но это не помогает. Украшение удаляется только на короткий период анимации, но затем появляется снова, пока он все еще работает.

Также настройка включает RecyclerView.Adapter который hasStableIds () (в случае, если бит имеет значение).

Solutions Collecting From Web of "Как отключить чертеж украшения элемента RecyclerView для продолжительности анимации элементов"

Это может зависеть от типа используемой анимации, но, по крайней мере, для DefaultItemAnimator вам нужно учитывать перевод X / Y, выполняемый во время анимации. Вы можете получить эти значения с помощью child.getTranslationX() и child.getTranslationY() .

Например, для вертикального случая onDraw/onDrawOver :

 private void drawVertical(Canvas c, RecyclerView parent) { final int left = parent.getPaddingLeft(); final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); final int dividerHeight = mDivider.getIntrinsicHeight(); for (int i = 1; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final int ty = (int)(child.getTranslationY() + 0.5f); final int top = child.getTop() - params.topMargin + ty; final int bottom = top + dividerHeight; mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } 

(Вы можете использовать ViewCompat.getTranslationY(child) если вам нужно поддерживать <API 11.).

Примечание. Для других типов анимаций могут потребоваться дополнительные корректировки. (Например, также может потребоваться учет горизонтального перевода.)

Нашел ответ сам:

Чтобы скрыть украшения предметов во время анимации элемента, вы можете просто использовать эту проверку в onDraw/onDrawOver :

 public void onDrawOver(..., RecyclerView parent, ...) { if(parent.getItemAnimator() != null && parent.getItemAnimator().isRunning()) { return; } // else do drawing stuff here }