Android RecyclerView 는 부유 흡 정,구분자,최종 알림 효 과 를 실현 합 니 다.

본 논문 의 모든 효 과 는 ItemDecoration 을 통 해 이 루어 집 니 다.이 를 통 해 업무 와 결합 하여 RecyclerView 의 템 플 릿 을 더욱 간결 하 게 하고 보조 적 인 ui,github 주소 에 관심 이 없습니다.
1.상단 흡착 효과 도
所有都吸附
2.상단 불 흡착 효과 도
顶部不吸附效果
3.한 화면 미 만 효과
不满一屏效果
4.핵심 실현 점
1.왜 ItemDecoration 을 통 해'원리'를 실현 할 수 있 습 니까?
① getItemOffsets()방법 을 통 해 현재 템 플 릿 view 의 left,top,right,bottom 사 이 드 를 가 져 옵 니 다.이 남 겨 진 거 리 는 보조 적 인 ui 를 그 리 는 데 사 용 됩 니 다.

// RecyclerView measure child  
public void measureChild(@NonNull View child, int widthUsed, int heightUsed) {
      final LayoutParams lp = (LayoutParams) child.getLayoutParams();
  // getItemOffsets()            
      final Rect insets = mRecyclerView.getItemDecorInsetsForChild(child);
      widthUsed += insets.left + insets.right;
      heightUsed += insets.top + insets.bottom;
      final int widthSpec = getChildMeasureSpec(getWidth(), getWidthMode(),
          getPaddingLeft() + getPaddingRight() + widthUsed, lp.width,
          canScrollHorizontally());
      final int heightSpec = getChildMeasureSpec(getHeight(), getHeightMode(),
          getPaddingTop() + getPaddingBottom() + heightUsed, lp.height,
          canScrollVertically());
      if (shouldMeasureChild(child, widthSpec, heightSpec, lp)) {
        child.measure(widthSpec, heightSpec);
      }
    }
② onDrawOver()를 통 해 부유 보 기 를 그립 니 다.ui 는 모든 하위 보기 위 에 있 습 니 다.

@Override
  public void draw(Canvas c) {
    super.draw(c);
 // RecyclerView       onDrawOver()  
    final int count = mItemDecorations.size();
    for (int i = 0; i < count; i++) {
      mItemDecorations.get(i).onDrawOver(c, this, mState);
    }
 }
③ onDraw()방법 으로 분할 선 등 보 기 를 그립 니 다.

 public void onDraw(Canvas c) {
    super.onDraw(c);
 //   onDraw()  ,   RecyclerView view
    final int count = mItemDecorations.size();
    for (int i = 0; i < count; i++) {
      mItemDecorations.get(i).onDraw(c, this, mState);
    }
  }
2.'도대체 힌트'그리 기
getItemOffsets()에서 하위 보기 의 너비 와 높이 를 가 져 올 수 없 기 때문에 measure 가 없습니다.getItemOffsets()에 높이 를 추가 한 후 한 화면 에 만족 하지 않 으 면 onDraw()방법 에서 수정 해 야 합 니 다.수정 방식 은 다음 과 같 습 니 다.
mDecorInsets 속성 을 반사 하여 getItemOffsets()방법 에 설 정 된 값 을 초기 화 합 니 다.

private void setDecorInsetsBottom(RecyclerView.LayoutParams param, int bottom) {
    try {
      //   RecyclerView.LayoutParams  mDecorInsets   
      Field filed = RecyclerView.LayoutParams.class.getDeclaredField("mDecorInsets");
      filed.setAccessible(true);
      Rect decorRect = (Rect) filed.get(param);
      decorRect.bottom = bottom;
    } catch (Exception e) {
    }
  }
총결산
위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 안 드 로 이 드 리 클 러 뷰 입 니 다.부유 흡 정,분리 선,최종 제시 효 과 를 실현 하고 여러분 께 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기