뷰페이저를 사용할때는 어댑터를 사용해야 하는데, 뷰페이저는 리사이클러 뷰를 상속받기 때문에 리사이클러 어댑터를 사용할 수 있다.
(리스트 어댑터도 사용가능)
이 경우 뷰페이저외부에 현재 아이템의 정보를 받와야 하는경우 문제가 발생한다.
뷰페이저에 리사이클러뷰 어탭터 계열을 사용하면 Fragment
를 생성하지 않고 Item
으로 전달해 사용이 가능하다. 이 경우에는 프래그먼트가 생성되어 ViewPager
에 연결되는 대신 리사이클러 뷰와 같이 뷰페이저의 한 화면에 아이템들이 연결된다.
이 경우 외부에서 현재 표시되고 있는 뷰페이저의 아이템을 가지고 오려고 할 경우, 뷰홀더에서 인터페이스를 통해 데이터를 전달할경우 사전 로딩때문에 타이밍 이슈가 생긴다.
뷰페이저에 리사이클러뷰 어댑터를 사용할 경우 아이템을 전환할때 현재 표시되고 있는 아이템 다음에 호출될 아이템이 사전생성 되는데 이때 뷰홀더의 코드들이 실행되며, 가장 마지막에 생성된 아이템이 현재 화면에 노출되고 있는 아이템이 아니라 사전생성된 아이템이기때문에 뷰홀더를 통해 데이터를 불러올 경우 현재 정보를 받아오는게 힘들다.
따라서 현재 표시되고있는 아이템은 다른 방법을 통해 가져와야한다.
(preloading개수를 0으로 만드는 함수나 다른 사전로딩을 없애는 로직들은 deprecate 되었다.)
다양한 방법들을 시도해본 결과 어댑터 내부에서 실행하는 방법은 현재로써는 찾기 힘들었다. 그래서 뷰페이저의 OnPageChangeListener
를 사용해 override
함수를 사용해 현재 아이템의 정보를 구해서 외부에 사용했다.
OnPageChangeListener
는 3개의 함수를 가지고 있는데, 페이지가 선택되었을 때의 데이터가 필요하기 때문에 onPageSelected
함수를 override
해서 사용했다.
먼저 현재 뷰페이저의 currunt List
를 받아온다.
그후onPageSelected
를 통해서 아이템이 화면에 표시 (Selected
)되면 currunt item
을 통해서 현재 표시되고 있는 아이템의 index
를 가져온 뒤 currunt list
에서 해당 아이템을 불러와 데이터를 입력해주면 외부에서 현재 표시중인 아이템의 정보를 받아올 수 있다.
오늘도 새벽을 불태웠다.
왜 벌써 5시인거지?