RecyclerView의 ItemAnimator를 구현하여 notifyItemChanged 애니메이션을 비활성화하는 방법
내 프로젝트에서 RecyclerView
while 의 "변경"애니메이션을 비활성화해야합니다 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);
'development' 카테고리의 다른 글
별 5 개 등급을 계산하는 데 사용되는 알고리즘 (0) | 2020.12.06 |
---|---|
선택적 문자열 확장을 추가하는 방법은 무엇입니까? (0) | 2020.12.06 |
오류 : com.google.gms : google-services : 1.0을 찾을 수 없습니다. (0) | 2020.12.06 |
'내부'보호 수준으로 인해 이니셜 라이저에 액세스 할 수 없습니다. (0) | 2020.12.06 |
Windows에서 Charles Web Proxy 및 최신 Android 에뮬레이터를 사용하여 SSL 인증서를 구성하는 방법은 무엇입니까? (0) | 2020.12.06 |