모바일 프로그래밍/안드로이드
RecyclerView의 scrollToPosition나 smoothScrollToPosition 사용 시 Item사이의 margin이 있는 경우
창굴이
2019. 5. 10. 13:56
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 은 위 와 같이 구현되어 있다.