기획자의 요구사항은 다음과 같았다.
- 첫번째 아이템은 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개의 댓글