본문으로 바로가기

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 은 위 와 같이 구현되어 있다.