ViewPager(뷰페이져) Preload 문제 관련

Posted by ITPangPang
2016. 6. 21. 23:08 안드로이드(android)/개발중 생긴일


ViewPager(뷰페이져) 

Preload 문제관련


ㆍ 요즘 Fragment에서 ViewPager를 많이 쓰는데 

    많이 쓰는 만큼 해결해야 하는 부분도 많은 것 같다.


ㆍ ViewPager는 사용하는 Fragment 화면에 들어가게 되면

    Preload되는 현상이 있다.


ㆍ 예를 들어 ViewPager의 페이지가(item) 3개일 경우

    첫화면(첫페이지)에서는 2번째 페이지를 이미 load 하고 있다

    마찬가지로 2번째 페이지로 넘어갔을때는 3번째 페이지까지 load한다



이렇다 보니

발생하는 문제점이 있다.


예를 들어 

1번째 페이지에서

작업하던 값을


2번째 페이지로

넘겨서 뿌려야하는 경우가 있다.


첫번째 값에 따라

2번째 페이지의 레이아웃이

변한다던가


아니면 첫번째값의

결과에 따라


전체 Pager의 수가

달라지는 경우라던가


하여튼,

이런 문제를 해결하기

위해 구글링을 

많이 해봤는데


그 중에

setOffscreenPageLimit라는

답변이 많이 보였다


근데 대부분 답변에 달린

댓글을 보면 안된다는

댓글이 많다..


그래서 나도

안될것 같아서

안해봤다.

(대충 0이 들어가야할것 같은데

최소 1이 들어가야 한단다..)


무튼...

좀 더 찾아보니

눈에 확 들어오는 방법이

있었다.


그것은 바로

setUservisibleHint


이것이었다..


대충 코드는

이렇다.

@Override
public void setUserVisibleHint(boolean isVisibleToUser)
{
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser)
{
//실제로 사용자 눈에 보이는경우
}
else
{
// 전페이지에서 Preload 될 경우
}
}


이게 무슨말인가 하면

지금 사용자의 눈에

실질적으로 그 페이지가

보여지고 있느냐

없느냐 이다..


이 코드를

ViewPager의

 2번째 페이지에

넣는다.


Alt+Insert해서

오버라이드 하면

바로 쉽게 추가된다.


그리고

넘어오는 파라미터는

boolean값이므로

true : 사용자의 눈에 보인다

false : 사용자의 눈에 안보인다(preload)


여기서 처리를 해주면 된다.


false일때는

만약 미리

넘어와서 오류가 생기는경우

예외처리 해주면 되고


true일때는

전 페이지에서의

값을 받으면 된다.


Log를 찍어보면

첫번째 페이지에서

불려올때


setUserVisibleHint는

onCreateView보다

먼저 걸린다.


그리고 1페이지에서

2페이지로 넘어올때


onCreateView는

호출이 안되는데


setuserVisibleHint는

호출이 된다.


그러므로 1페이지의

결과값을 반영하려면

setUserVisibleHint에서

처리해주면 될 것같다.


테스트만 간단히 해봤지만

실제로 사용해도

문제가 없을 것 같다.