본문 바로가기

나의 플랫폼/안드로이드

[Andorid] Vertical RecyclerView 안에 Horizontal RecyclerView 스크롤

이건 괜찮은 블로그 내용이 있어서 공유 합니다.


http://nerds.headout.com/fix-horizontal-scrolling-in-your-android-app/


제가 이해한 블로그 내용은


RecyclerView는 스크롤 방향만 신경 쓰지, 움직이는 각도에 신경을 쓰지 않는다는 애기 입니다.

@Override
public boolean onInterceptTouchEvent(MotionEvent e) {  
  ...

  switch (action) {
    case MotionEvent.ACTION_DOWN:
        ...

    case MotionEvent.ACTION_MOVE: {
        ...

        if (mScrollState != SCROLL_STATE_DRAGGING) {
          boolean startScroll = false;
          if (canScrollHorizontally && Math.abs(dx) > mTouchSlop) {
            ...
            startScroll = true;
          }
          if (canScrollVertically && Math.abs(dy) > mTouchSlop) {
            ...
            startScroll = true;
          }
          if (startScroll) {
            setScrollState(SCROLL_STATE_DRAGGING);
          }
       }
    } break;
      ...

  }
  return mScrollState == SCROLL_STATE_DRAGGING;
}

위 소스를 보면 단지 canScrollHorizontally, canScrollVertically 에따라 스크롤 이동만 보고 있다는 의미 네요.


그래서 아래와 같이 스크롤 이동 외에 횡스크롤일때 종스크롤 상태, 그리고 종스크롤 일때 횡스크롤 상태를 봐야 한다는 애기 네요.


if(canScrollVertically && Math.abs(dy) > mTouchSlop) {...}  
if(canScrollVertically && Math.abs(dy) > mTouchSlop && (canScrollHorizontally || Math.abs(dy) > Math.abs(dx))) {...}  


그리고 이것을 구현한 소스가 아래에 있습니다.


BetterRecyclerView : https://gist.github.com/manidesto/ecccd38787fa8e287a3f18bcd9867189


이 BetterRecyclerView를 상속 받아서 사용 하면

onInterceptTouchEvent 함수를 통해서 터치를 제어 해준다는 거죠.


테스트는 해봤는데 그리 크게는 느끼지 못하지만 나름 안정성은 있는듯 합니다.


개인적으로 없는 것 보다 위 클래스를 통해 컨트롤 해주는게 나쁘지 않더라구요.

참고하세요.