development

RecyclerView의 ItemAnimator를 구현하여 notifyItemChanged 애니메이션을 비활성화하는 방법

big-blog 2020. 12. 6. 21:48
반응형

RecyclerView의 ItemAnimator를 구현하여 notifyItemChanged 애니메이션을 비활성화하는 방법


내 프로젝트에서 RecyclerViewwhile 의 "변경"애니메이션을 비활성화해야합니다 notifyItemChanged.

나는 소스에서 조사 하고 아래와 같이 RecyclerView재정의 android.support.v7.widget.DefaultItemAnimator했습니다.

private static  class ItemAnimator extends DefaultItemAnimator
{
    @Override
    public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromX, int fromY, int toX, int toY) {
        if(oldHolder != null)
        {
            oldHolder.itemView.setVisibility(View.INVISIBLE);
            dispatchChangeFinished(oldHolder, true);
        }

        if(newHolder != null)
        {
            dispatchChangeFinished(newHolder, false);
        }

        return false;
    }
}

하지만 Google 문서의 사양과 일치하는지 잘 모르겠습니다. RecyclerView.ItemAnimator.animateChange

내 이해 소스 코드에 따르면 메서드를 올바르게 재정의하지 않으면 oldHolder 재활용 되지 않습니다 .

animateChange올바른 방법으로 재정의하는 방법을 알아 내도록 도와주세요 .


animateChange를 제거하는 올바른 솔루션을 찾았습니다.

아주 간단합니다. Google은 기능을 구현했습니다.

((SimpleItemAnimator) RecyclerView.getItemAnimator()).setSupportsChangeAnimations(false);

문서 : setSupportsChangeAnimations


나는 같은 문제가 있었다. notifyItemChanged를 호출 할 때 빨간색 오버레이가 깜박입니다. 코드를 실험 한 후 마침내 간단히 호출하여 기본 Animator를 제거했습니다.

recyclerView.setItemAnimator(null);

RecyclerView에서.


Google setSupportsChangeAnimations()이 지원 라이브러리 23.1.0에서 방법을 제거하기 때문에 @Kenny 답변이 더 이상 작동하지 않았습니다 .

어떤 경우에는 setChangeDuration(0)해결 방법으로 작동 할 수 있습니다.

@edit 다음과 같이 사용하는 것이 좋습니다.

  RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator();
        if (animator instanceof SimpleItemAnimator) {
            ((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
        }

해결책을 찾았다면 DefaultItemAnimator가 제공하는 모든 애니메이션을 유지하고 싶지만 뷰가 업데이트 될 때마다 발생하는 "깜박임"애니메이션을 제거하려는 모든 사람을위한 것입니다.

먼저 DefaultItemAnimator의 소스 코드를 가져옵니다. 프로젝트에서 같은 이름의 클래스를 만듭니다.

둘째, 다음과 같이 ItemAnimator를 수정 된 DefaultItemAnimator의 새 인스턴스로 설정합니다.

recyclerView.setItemAnimator(new MyItemAnimator());

그런 다음 새 클래스 소스 코드로 이동하여 메서드를 찾습니다.

animateChangeImpl(final ChangeInfo changeInfo) { ... }

이제 알파 값을 변경하는 메서드 호출을 찾기 만하면됩니다. 다음 두 줄을 찾아 .alpha (0) 및 .alpha (1) 제거

oldViewAnim.alpha(0).setListener(new VpaListenerAdapter() { ... }
newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()).alpha(1).setListener(new VpaListenerAdapter() { ... }

그렇게

oldViewAnim.setListener(new VpaListenerAdapter() { ... }
newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()).setListener(new VpaListenerAdapter() { ... }

누군가 나처럼 비틀 거리는 경우 :
어떻게 든 setSupportsChangeAnimations(false)나를 위해 작동하지 않았지만 recyclerView.getItemAnimator().setChangeDuration(0)애니메이션을 멋지게 제거했습니다.


가장 쉬운 해결책은 생성자에서 확장 DefaultItemAnimator하고 오른쪽으로 설정 setSupportsChangeAnimations하는 false것입니다.

public class DefaultItemAnimatorNoChange extends DefaultItemAnimator {
    public DefaultItemAnimatorNoChange() {
        setSupportsChangeAnimations(false);
    }
}

위의 솔루션 중 어느 것도 나를 위해 일하지 않았습니다. 효과가 있었던 것은 TransitionManager 를 사용하고 장면 전환을 null로 설정하는 것입니다.

TransitionManager.go(new Scene(recyclerView), null);

기본 애니메이션 다시 활성화 하려면 자동 전환을 만들고 위와 동일한 방법으로 설정할 수 있습니다 .

AutoTransition autoTransition = new AutoTransition();
TransitionManager.go(new Scene(recyclerView), autoTransition);

참고URL : https://stackoverflow.com/questions/29873859/how-to-implement-itemanimator-of-recyclerview-to-disable-the-animation-of-notify

반응형