RecyclerView의 scrollToPosition나 smoothScrollToPosition 을 사용할 경우 각각의 Item 사이의 margin이 존재하여 정확한 위치에 스크롤 되지 않고 Margin만큼 벌어져서 보여지게 되는 경우가 있다.
val smoothScroller = object : LinearSmoothScroller(context) {
override fun getHorizontalSnapPreference(): Int {
return LinearSmoothScroller.SNAP_TO_END
}
}
smoothScroller.targetPosition = nextPosition
layoutManager.startSmoothScroll(smoothScroller)
수평, 수직 형태의 RecyclerView에 따라 getHorizontalSnapPreference(), getVerticalSnapPreference() 를 오버라이딩 하여 scroll시 Item의 margin 위치에 따라 시작, 끝 기준을 정하여 구현해주면 된다.
smoothScroller의 인스턴스를 프로퍼티로 선언하여 targetPosition만 변경하여 재사용할 경우
Smooth Scroll action is being updated too frequently. Make sure you are not changing it unless necessary
위 같은 Warning이 발생하여 새로운 인스턴스를 할당하여 변경하라고 나오게 된다.
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
int position) {
LinearSmoothScroller linearSmoothScroller =
new LinearSmoothScroller(recyclerView.getContext());
linearSmoothScroller.setTargetPosition(position);
startSmoothScroll(linearSmoothScroller);
}
실제 LinearLayoutManger 에서의 smoothScrollToPosition 은 위 와 같이 구현되어 있다.
'모바일 프로그래밍 > 안드로이드' 카테고리의 다른 글
DialogFragment 에서 초기화 지연(by lazy) 사용 시 발생한 버그 (0) | 2019.06.17 |
---|---|
java.lang.IllegalStateException: Fragment already added: DialogFragment (0) | 2019.06.12 |
코틀린 접근 제한자 (Visibility Modifiers): private, protected, internal, public (0) | 2019.04.19 |
Dagger2에서 발생하는 java.lang.IllegalArgumentException: No injector factory bound for Class 에러 (0) | 2019.04.18 |
안드로이드 간단히 View 움직이게 하기 (Drag and Drop) (0) | 2019.04.12 |