안 드 로 이 드 에서 Recycle View 는 끝까지 내 려 가 는 감청 예 시 를 추가 합 니 다.

4607 단어 recycleviewandroid
우리 의 일상 개발 에 서 는 드 롭 다운 리 셋 을 자주 사용 하 는데,인터넷 에서 가장 좋 은 오픈 소스 드 롭 다운 리 셋 구성 요 소 는 당연히android-Ultra-Pull-To-Refresh이 구성 요 소 는 모든 컨트롤 에 드 롭 다운 리 셋 기능 을 추가 할 수 있 습 니 다.물론 리 콜 뷰 도 포 함 됩 니 다.
안 타 깝 게 도android-Ultra-Pull-To-Refresh드 롭 다운 리 셋 기능 만 제 공 했 을 뿐 목록 류 의 구성 요소 에 대해 저 희 는 일상 개발 에서 위로 끌 어 올 리 거나 끝까지 미 끄 러 지 는 자동 로드 기능 을 더 많이 사용 합 니 다.물론 현재 로 서 는 사용자 들 이 끝까지 미 끄 러 지 는 자동 로드 기능 을 더 좋아 합 니 다.예 를 들 어 오늘 말 한 recycleview 는 우리 스스로 미끄럼 부 에 더 많은 기능 을 추가 할 수 밖 에 없다.
그것 의 실현 원 리 는 신마 입 니 다.아주 간단 합 니 다.
Recycle View 내부 에 스크롤 이 벤트 를 수신 하기 위해 슬라이딩 감청 추상 클래스 OnScroll Listener 가 있 는데,이 중 두 가지 실현 방법 이 있 습 니 다.

public abstract static class OnScrollListener {
    /**
     * Callback method to be invoked when RecyclerView's scroll state changes.
     *
     * @param recyclerView The RecyclerView whose scroll state has changed.
     * @param newState   The updated scroll state. One of {@link #SCROLL_STATE_IDLE},
     *           {@link #SCROLL_STATE_DRAGGING} or {@link #SCROLL_STATE_SETTLING}.
     */
    public void onScrollStateChanged(RecyclerView recyclerView, int newState){}

    /**
     * Callback method to be invoked when the RecyclerView has been scrolled. This will be
     * called after the scroll has completed.
     * <p>
     * This callback will also be called if visible item range changes after a layout
     * calculation. In that case, dx and dy will be 0.
     *
     * @param recyclerView The RecyclerView which scrolled.
     * @param dx The amount of horizontal scroll.
     * @param dy The amount of vertical scroll.
     */
    public void onScrolled(RecyclerView recyclerView, int dx, int dy){}
  }

다 원 코드 주석 을 통 해 알 수 있 습 니 다.
onScroll State Changed 는 recyclerview 의 스크롤 상태 가 바 뀌 었 을 때 호출 합 니 다.
onScrolled 는 레이아웃 이 보이 고 recycleview 가 굴 러 갈 때 호출 됩 니 다.
그렇다면 생각 은:
(1)onScrollStateChanged 방법 에서 현재 스크롤 상태 가 스크롤 을 멈 춘 상태 라 고 판단 합 니 다.
(2)그리고 api 의 방법 에 따라 마지막 으로 볼 수 있 는 위 치 를 얻 습 니 다.
(3)현재 보 이 는 recycleview 에서 item 의 개수 가 0 보다 크다 고 판단 합 니 다.
(4)마지막 에 볼 수 있 는 위치 가 item 총수 보다 1 이상 이 라 고 판단 한다.
(5)그리고 아 이 템 의 총 수 는 보 이 는 아 이 템 보다 크 면 한 화면 을 초과 할 때 실 행 될 수 있 습 니 다.
양보 면 의 요 구 를 만족 시 킬 때 우 리 는 인터페이스 리 셋 을 통 해 우리 의 시간 소모 논 리 를 실행 하고 불 러 오 는 dialog 를 표시 할 수 있다.
RecyclerView 는 layoutManager 를 통 해 목록,표,폭포 류 로 유연 하 게 전환 할 수 있 기 때문이다.특히 폭포 가 흐 를 때 마지막 으로 보 이 는 위치 가 다 르 기 때문에 우 리 는 서로 다른 layoutManager 상태 에 따라 해당 하 는 마지막 보 이 는 위 치 를 가 져 야 한다.
코드:

 @Override
  public void onScrollStateChanged(int state) {
    if (state == RecyclerView.SCROLL_STATE_IDLE && mLoadingListener != null) {
      LayoutManager layoutManager = getLayoutManager();
      int lastVisibleItemPosition;
      if (layoutManager instanceof GridLayoutManager) {
        lastVisibleItemPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition();
      } else if (layoutManager instanceof StaggeredGridLayoutManager) {
        int[] into = new int[((StaggeredGridLayoutManager) layoutManager).getSpanCount()];
        ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(into);
        lastVisibleItemPosition = findMax(into);
      } else {
        lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
      }
      if (layoutManager.getChildCount() > 0
          && lastVisibleItemPosition >= layoutManager.getItemCount() - 1 && layoutManager.getItemCount() > layoutManager.getChildCount()) {
          View footView = mFootViews.get(0);
        footView.setVisibility(View.VISIBLE);
        mLoadingListener.onLoadMore();
      }
    }
  }

우 리 는 api 를 통 해 폭포 류 의 모든 열 을 얻 을 수 있 고 아래 의 방법 을 통 해 맨 아래 의 열 을 찾 을 수 있다.불 러 온 dialog 를 이 열 아래 에 표시 합 니 다.

 private int findMax(int[] lastPositions) {
    int max = lastPositions[0];
    for (int value : lastPositions) {
      if (value > max) {
        max = value;
      }
    }
    return max;
  }
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기