기획자의 요구사항은 다음과 같았다.

  • 첫번째 아이템은 RecyclerView 왼쪽편에 snap되어야할 것
  • 마지막 아이템은 RecyclerView 오른쪽편에 snap되어야할 것
  • 첫번째와 마지막 아이템을 제외하고는 아이템뷰의 중앙을 기준으로 RecyclerView 중앙에 스냅되도록 배치 할 것

 

SnapHelper를 사용하면되겠구나!

PagerSnapHelper를 사용하니 한페이지 단위로만 snap되므로 RecyclerView내에 2개 이상 Completely Visible 아이템이 보이는경우는 snap 제대로 스냅 되지 않았다. 예를 들면 폰에서는 괜찮은데 테블릿에서는 문제가 될 수 있는것이다.

그렇다면 LinearSnapHelper다.

LinearSnapHelper는 아이템뷰의 중앙을 기준으로 RecyclerView의 중앙에 배치하고, 첫번째 아이템은 RecyclerView의 왼쪽에 잘 snap되었다. 잘 되는가 싶더니 두번째 요구사항인 마지막 아이템의 snap이 말썽이였다. LinearSnapHelper의 경우 아이템뷰의 중앙을 기준으로 배치하기 때문에 마지막 아이템뷰가 RecyclerView의 중앙까지 스크롤되지 않는다면 snap되지 않는것이였다.

결국 LinearSnapHelper를 커스터마이징해야한다.

@Nullable
private View findCenterView(RecyclerView.LayoutManager layoutManager, OrientationHelper helper) {
    if (layoutManager instanceof LinearLayoutManager) {
        LinearLayoutManager llm = (LinearLayoutManager) layoutManager;
        if (llm.findFirstCompletelyVisibleItemPosition() == 0) { //첫번째 아이템은 그냥 무시
            return llm.getChildAt(0);
        } else if (llm.findLastCompletelyVisibleItemPosition() == layoutManager.getItemCount() - 1) {
            //스크롤에 의해 마지막 아이템이 완전히 보이면 센터가 아닌 마지막 아이템을 강제로 타겟뷰로 지정한다.
            return llm.getChildAt(layoutManager.getItemCount() - 1);
        }
    }
    ...
}

LinearLayoutSnapHelper를 상속하여 findCenterView메소드에 위의 내용을 추가하면 마지막 아이템이 오른쪽이 잘 snap되는것을 경험할 수 있다.

카테고리: 미분류

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.