그 동안 앱을 만들 때 메인 메뉴 네비게이션은 각각 버튼을 만들고, 해당 버튼을 클릭하면 Fragment가 호출되는 방식으로 앱 화면을 구현했는데, 최근 Firebase sample app 예제 소스를 보던 중 메인메뉴 네비게이션을 Viewpager로 구현하는 예제를 보고 간단한 소스와 Adapter를 쓰는 영리함(?)에 감흥을 받아 기존에 만지고 있던 앱들의 메인 메뉴 네비게이션을 모두 Viewpager로 구현했다.


Viewpager로 네비게이션을 구현하고 나니 다음과 같은 장점이 있었다.


- 네비게이션 버튼 스타일링을 할 필요가 없어졌고, 메뉴 버튼 선택에 따른 UI변경 사항을 구현할 필요가 없어졌다.

- 좌우 슬라이딩을 통해 메뉴 이동이 가능해져 보다 훌륭한 UX를 제공한다.

- 핵심적으로 소스코드가 간결하다.






그런데, Viewpager를 통해 구현할 경우 Fragment를 호출했을 때 내용이 갱신이 되지 않는 현상이 발생했다.

어찌보면 간단한 내용인데 이것 때문에 이틀째 해결책을 고민하고 있었다.


일반으로 구글링을 하다보면 가장 많이 제안해주는 방법은 FragmentPagerAdapter를 사용하지 않고 FragmentStatePagerAdpater를 사용하는 방법이다.


참고 링크:

http://gogorchg.tistory.com/entry/Android-FragmentPagerAdapter-%EA%B0%B1%EC%8B%A0


내가 원했던 것은 페이지가 바뀔 때마다 Fragment 안에 있는 특정 데이터들이 갱신되는 것이었는데 해결이 되지 않았다.

Fragment의 View를 재활용하지 않고 새로 그리는 것 같은데, 데이터베이스에서 데이터가 업데이트 됐는지 한번 더 불러오는 작업은 하지 않았다.


그러던 중 Adapter쪽에 왠지 현재 Fragment가 선택될 때 Event를 감지 하는 부분이 있지 않을까 싶어서 확인해보니 역시 선택된 페이지를 확인하는 기능이 존재 했다. 직접 소스를 보면 다음과 같다.


mViewPager.setAdapter(pageAdapter);
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

@Override
public void onPageSelected(int position) {


}

@Override
public void onPageScrollStateChanged(int state) {

}
});

위 소스에서 확인할 수 있는 것과 같이 페이지를 선택하면 OnPageSelected 부분이 현재 페이지가 몇 번째 페이지인지 확인해준다.

이 부분에 Refresh하고 싶은 데이터를 갱신하는 코드를 입력하면 ViewPager를 사용하더라도 데이터를 갱신 할 수 있게 된다.



+ Recent posts