흡수 Item 의 간단 한 실현 방법 공유

5152 단어 android흡 정Item

일반적으로 위의 그림 스타일 의 Sticker 에 대해 서 는 Coordinator Layout&AppBarLayout 를 사용 하면 실현 이 라 고 할 수 있 습 니 다.
근 데 밑 에 이런 거 는 요?

나의 실현 사고.
우선 전체 페이지 의 UI 구 조 는 RecyclerView 를 통 해 이 루어 진다.
위 에 있 는 이 스티커 의 실현 은 레이아웃 의 맨 위 에 RecyclerView 에서 흡수 할 Item 과 똑 같은 레이아웃 을 추가 한 것 입 니 다.그리고 RecyclerView 의 스크롤 을 감청 합 니 다.

mPostDetailRv.addOnScrollListener(object : RecyclerView.OnScrollListener() {
 override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
  if (pageStatus == null || pageStatus.stickerPos == -1) return

  val preHolder = recyclerView.findViewHolderForAdapterPosition(pageStatus!!.stickerPos - 1)
  val targetHolder = recyclerView.findViewHolderForAdapterPosition(pageStatus!!.stickerPos)

  var offset = if (targetHolder != null) { //    
   -targetHolder.itemView.top
  }else{
   0
  }

  if (preHolder != null) {
   offset = -1 
  }

  if (offset < 0) {
   mPostDetailCommentHeaderSticker.visibility = View.GONE
  } else {
   mPostDetailCommentHeaderSticker.visibility = View.VISIBLE
  }
 }
}
위의 page Status.stickerPos 는 Sticker 가 RecyclerView 에 있 는 데이터 의 위치 입 니 다.위의 논 리 는 사실 비교적 복잡 하지만 수 요 를 실현 했다(- -).내 가 설명 할 게.
즉,Sticker 가 itemView.top 과 Sticker 에 의존 하 는 이전 itemview 가 나 타 났 는 지 판단 합 니 다.
  • 현재 Sticker 의 itemview 가 RecyclerView 에 나타 나 면 itemView.top 에 따라 상단 으로 굴 렀 는 지 여 부 를 판단 합 니 다
  • 4.567917.이전 아 이 템 뷰 가 RecyclerView 에 없 었 다 면(회수 되 었 다)꺼 졌 을 것 이다.이때 바로 4.567918 이 나 타 났 다.
    위의 논 리 는 매우 이상 하지만,확실히 흡수 의 수 요 를 실현 하 였 다.
    그러나 뒤의 수요 교체 에서 Sticker ItemView 의 이전 ItemView 는 계속 변화 하기 때문에 위의 코드 에 bug 가 나 타 났 습 니 다...그럼 어떻게 해결 하지?
    더 간단 하고 통용 되 는 방법.
    마지막 으로 영감 이 떠 올 랐 습 니 다.StickerItemView 의 디 스 플레이 에 대해 저 는 앞의 ItemView 에 의존 하지 않 아 도 됩 니 다.
    
    mPostDetailRv.addOnScrollListener(object : RecyclerView.OnScrollListener() {
     override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
      val currentDataPos = recyclerView.getChildAdapterPosition(recyclerView.getChildAt(0))
    
      if (pageStatus != null && currentDataPos < pageStatus.stickerPos) {
       mPostDetailCommentHeaderSticker.visibility = View.GONE
      } else {
       mPostDetailCommentHeaderSticker.visibility = View.VISIBLE
      }
     }
    })
    위의 이 코드 는 bug 를 쉽게 복구 하 였 습 니 다.그리고 그 논 리 는 매우 간단 하고 통용 된다.
    현재 RecyclerView 에 표 시 된 첫 번 째 항목 의 위치 가 Sticker Item 의 위치 보다 큰 지 판단 하고 크 면 흡 정 Sticker 를 보 여 줍 니 다.
    효과:

    위 와 같은 실현 은 UI 구조 만 적용 되 는 RecyclerView 의 경우 입 니 다.
    PASS:만약 당신 이 이렇게 한다 면 나 를 무시 하 세 요(- -)
    더 작은 공유:AdvancedAndroid
    총결산
    이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기