마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

FragmentStatePagerAdapter에서 현재 페이지 기준 좌우페이지의 fragment들의 state를 없앨 수도 있나요?

0 추천
달력을 만들고 있는데 대략적인 구조는 이렇습니다.

- Viewpager가 있는 A클래스.

- Viewpager 어댑터 FragmentStatePagerAdapter를 상속하는 B클래스.

- Fragment 상속하는 C클래스.

 

지금 C클래스에 gridview를 통해 달력을 구현했고, girdview.setOnItemClickListener를 통해 날짜를 클릭하면 해당 날짜 백그라운드만 변경되게 구현했습니다.(6/1눌렀다가 6/5누르면, 6/1 백그라운드는 다시 원상태로 돌아오고 6/5 백그라운드가 변경되는......)

지금 뷰페이저에서 보여지는 현재페이지의 달은 이렇게 잘 구현되는데, 문제는 6월에서 클릭 후 7월로 넘긴 후 클릭후 다시 6월로 되돌아오면 달력의 클릭된 상태가 없어지지 않습니다. 하지만 6월에서 클릭 후 8월로 오면 6월 달력의 클릭된 상태가 깔끔하게 사라집니다.

6 ->7 ->6 : 6월 클릭된 상태 그대로있음.

6 ->7 ->8 : 6월 클릭된 상태 사라짐.

이게 FragmentStatePagerAdapter가 기본적으로 현재 페이지와 좌우 페이지를 제외하고는 메모리에서 Fragment를 없앤다고? 알고 있는데, 6->7->6로 왔을 때도 6->7->8  이때 처럼 뭔가 초기화할 수 없나요...?ㅠㅠ

옆으로 넘겼을 때 이전 페이지에 대한 상태를 초기화할 수 있으면 좋을텐데 방법이 없을까요...ㅠ
FragmentStatePagerAdapter 님이 2017년 6월 28일 질문

1개의 답변

0 추천

6 ->7 ->8 으로 이동할때 6번 fragment가 reset되는 이유는

ViewPager.setOffscreenPageLimit()의 default 설정값이 3이기 때문에

자동으로 날라가는 것입니다.

자동으로 날라가는 것이 의존하지 말고,

ViewPager.OnPageChangeListener의 onPageSelected(int position) callback을 이용해서

현재 선택되지 않은 fragement를 명시적으로 초기화 해주면 됩니다. (position 이외의 fragment들)

디자이너정 (42,810 포인트) 님이 2017년 6월 28일 답변
ViewPager.OnPageChangeListener의 onPageSelected(int position) callback을 이용해서 현재 선택되지 않은 fragement를 명시적으로 초기화를 하는 것은 A클래스에 있는 ViewPager.OnPageChangeListener의 onPageSelected(int position)메소드 안에다가 fragement를 명시적으로 초기화 해주는 방법을 말하는 것인가요?

제가 fragment가 각각 만들어진 상태가 아니라(?),
뷰페이저 어댑터 클래스인 B클래스에
(C클래스 ==Calendar_Dfragment)
(HashMap<Integer, Calendar_Dfragment>  frgMap;)

@Override
    public Fragment getItem(int position) {
        Calendar_Dfragment frg = null;
        if (frgMap.size() > 0) {
            frg = frgMap.get(position);
        }
        if (frg == null) {
            frg = Calendar_Dfragment.createInstance(position);
            frgMap.put(position, frg);
        }
        frg.setTimeByMillis(listMonthByMillis.get(position));
        return frg;
    }

이런식으로 만들어서 사용하는데 어떤식으로 초기화를 해줘야 되나요..?ㅠ
(C클래스 gridview의 클릭되어져 있는 background 이미지가 아니라 원상태로 만들어주고 싶은게 사실 목표인데... 초기화를 어떤식으로 해야될지...)
...