엄코딩의 개발 일지

 RecyclerView 화면에 보이는 아이템 추출


프로젝트 진행중에 화면에 띄워주어야 할 아이템은 많은데, 불려지는 순서대로 아이템의 이미지를 로딩하다보니


스크롤하면서 나중에 불려진 아이템의 이미지 로딩이 상당히 느린 상황을 겪게 되었습니다.


저는 안드로이드에서 자주사용하는 image load lib로 glide를 사용중입니다.


glide에는 priority라는 개념의 메소드가 있죠. 해당 메소드는 glide작업시 우선순위를 두고 우선순위가 높은 이미지부터


load하는 것입니다. 간단하게 살펴본 우선순위 타입은 다음과 같습니다.


Priority.Low

Priority.NORMAL

Priority.HIGH

Priority.IMMEDIATE


하지만 저는 위의 기능이 필요한 것이 아니었습니다.


그래서 저는 보이는 아이템, 즉 화면에 출력된 아이템들을 우선순위로 정하고, 해당 아이템의 데이터를 bind 시켜주는


작업을 시작 하게되었습니다.



 findFirstVisibleItemPosition


위 메소드는 화면에 보이는 영역 즉, 조금이라도 보이는 아이템의 포지션을 리턴합니다.




위와 같은 아이템이 있다고 가정해 보겠습니다.


findFirstVisibleItemPosition()메소드를 이용하면 0 을 리턴하게됩니다.


이는 화면에 보이는 제일 상단의 아이템 (item0) 의 포지션 값입니다.



 findFirstCompletelyVisibleItemPosition


위 메소드는 첫 번째로 설명드린 메소드와는 다소 차이가 있습니다.


이번에는 조금 다른 UI의 아이템으로 설명드리겠습니다.





위 사진과 같이 화면이 보인다고 가정해 보죠.


item0은 사용자의 스크롤에 의해 부분적으로 조금만 보이게됩니다.


바로 부분적으로 조금이라도 보이는 부분! 바로 findFirstCompletelyVisibleItemPosition의 리턴값입니다.


그렇기 때문에, item0의 포지션값인 0을 리턴하게됩니다.


 findLastVisibleItemPosition


이제 감이 오실겁니다.


findLastVisibleItemPosition은 화면에 보이게되는 마지막 아이템을 리턴하게 됩니다.




 findLastCompletelyVisibleItemPosition


마찬가지로 화면에 조금이라도 보이게되는 마지막 아이템의 포지션을 출력합니다.



위의 함수들을 사용하여 다음과 같이 화면에 보여지는 아이템들의 범위를 구하는 코드를 추출해 냈습니다.


if(position>= firstCompletlyVisibleItem && position<= lastCompletlyVisibleItem){
Log.e("visibleItem","position : $position")
}


이제 위의 기능들을 사용하여, 해당 ViewHolder에서 bind작업을 하면 될 것 같습니다.


전체 소스가 궁금하시거나, 피드백을 원하시는분들은 댓글 부탁드립니다.


감사합니다.