Android RecyclerView 스크롤 포 지 셔 닝

개술
RecyclerView 는 안 드 로 이 드 개발 에서 매우 실 용적 이 고 사용 하기 쉽 지만 실제 개발 에서 저 를 괴 롭 히 는 문제 가 있 습 니 다.바로 포 지 셔 닝 문제 입 니 다.실제 프로젝트 에서 이런 수 요 를 만 날 수 있 습 니 다.RecyclerView 의 특정한 항목(각 항목 의 높이 가 정확 하지 않 음)을 검색 한 다음 에 이 항목 을 포 지 셔 닝 하여 상단 에 표시 합 니 다.RecyclerView 의 기본 이동 방법 으로 는 이 를 실현 할 수 없다.이 블 로 그 는 내 개인 이 어떻게 이 수 요 를 실현 하 는 지 설명 한다.
데모 데모

코드 를 두 드 리 기 전의 사고.
RecyclerView 가 제공 하 는 이동 제어 방법 은 2 가지 입 니 다.
- scrollToPosition(int)
이 방법 은 지정 한 항목 을 표시 하 는 것 입 니 다.바로 당신 이 꼭대기 에 놓 고 싶 은 항목 을 표시 하 는 것 입 니 다.그러나 화면의 어떤 위치 에 있 든 상관 하지 않 습 니 다.그것 이 지금 보이 기만 하면 파업 합 니 다!
- scrollBy(int x,int y)
이 방법 은 스스로 이동 거 리 를 조절 하 는 것 이 고 단 위 는 픽 셀 이 어야 한다.
scrollToPosition 을 사용 할 때 앞 에 있 는 항목 으로 이동 할 때 기본적으로 표시 할 항목 을 위로 올 려 놓 지만 뒤에 있 는 항목 으로 이동 할 때 위치 가 좋 지 않 습 니 다.(기분 을 보 세 요!)보통 마지막 에 표 시 됩 니 다.쓰 신 건 다 아 실 거 예요.
scrollBy 를 사용 할 때 는 높이 나 너 비 를 스스로 계산 해 야 합 니 다.동적 레이아웃 에서 각 스타일 의 높이 가 다 를 수 있 는 상황 에서 스스로 높이 를 계산 하 는 것 은 매우 어렵다.
위 에서 이렇게 많은 쓸데없는 말 을 했 는데 결론 은 이 두 가지 방법 이 문 제 를 잘 해결 하지 못 한 다 는 것 이다.그러나 그들 두 사람 이 결합 하여 사용 할 때 우리 의 문 제 는 많이 해결 되 었 다.
사고방식 은:먼저 scrollToPosition 을 사용 하여 위 에 놓 을 항목 을 먼저 이동 해서 표시 한 다음 에 이 항목 이 위 에서 떨 어 진 거 리 를 계산 하고 scrollBy 로 마지막 100 미 터 를 완성 합 니 다!
키 코드
먼저 몇 번 째 항목 을 꼭대기 에 놓 고 상황 을 구분 하여 처리 해 야 한다.

 private void moveToPosition(int n) {
    //  RecyclerView LayoutManager            Position
    int firstItem = mLinearLayoutManager.findFirstVisibleItemPosition();
    int lastItem = mLinearLayoutManager.findLastVisibleItemPosition();
    //      
    if (n <= firstItem ){
    //                    
      mRecyclerView.scrollToPosition(n);
    }else if ( n <= lastItem ){
    //               
      int top = mRecyclerView.getChildAt(n - firstItem).getTop();
      mRecyclerView.scrollBy(0, top);
    }else{
    //                    
      mRecyclerView.scrollToPosition(n);
      //         RecyclerView       
      move = true;
    }

  }
RecyclerView 스크롤 감청

class RecyclerViewListener extends RecyclerView.OnScrollListener{
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
      super.onScrolled(recyclerView, dx, dy);
      //          (   100 !)
      if (move ){
        move = false;
        //               ,mIndex         RecyclerView    
        int n = mIndex - mLinearLayoutManager.findFirstVisibleItemPosition();
        if ( 0 <= n && n < mRecyclerView.getChildCount()){
          //          RecyclerView     
          int top = mRecyclerView.getChildAt(n).getTop();
          //     
          mRecyclerView.scrollBy(0, top);
        }
      }
    }
  }

데모 다운로드
[CSDN]: http://xiazai.jb51.net/201701/yuanma/RecyclerViewLocation(jb51.net).rar
[GitHub]: https://github.com/tyzlmjj/AndroidUI/tree/master/RecyclerViewLocation
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기