본문 바로가기
개발/android

FragmentPaper에서 ListView가 매번 초기화되지 않도록 하기

by 매몰 2019. 5. 23.

 

 

대부분의 앱은 탭과 리스트로 구성된다. 많은 정보를 간편하면서도 체계적으로 보여줄수 있기 때문이다.

Android에서 이러한 구조는 보통 FragmentPaper에 ListView를 넣어 구현한다.

 

FragmentPaper는 메모리 관리를 위해 사용자가 보고 있는 페이지과 양옆의 페이지만 유지하고 나머지는 죽이는데

내 경험상 완전히 죽이는것이 아니라 Fragment의 생명주기만 끝내는것 같다.

 

결과적으로, 페이지를 옮길때마다 Fragment가 초기화되어 그 안의 ListView 내용도 다 지워진다.

이를 방지하는 방법이 따로 있을지도 모르겠지만 나는 다음과 같이 onCreateView()에 몇줄을 코딩해 해결하곤 한다.

 

Fragment의 생명주기는 다시 시작되지만 Class 자체의 객체변수들은 그대로 남아있기 때문에 이를 이용하여 복구하는 방식이다.

 

private var list: ArrayList<MyItem>? = null
private var listPosition: Int = 0
private var listPositionTop: Int = 0

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment, container, false)

        val listView = view?.listView
        val list = this.list
        if (list == null) {
            //list가 없다면 새로 만들어 저장한다(최초 생성)
            val newList = ArrayList<MyItem>()
            newList.add(...)
            ...
            this.list = newList
            
            listView?.adapter = MyItemAdapter(context, newList)
        }
        else {
            //list가 있다면 복구한다
            listView?.adapter = MyItemAdapter(context, list)
            listView?.setSelectionFromTop(listPosition, listPositionTop)
        }

        listView?.setOnScrollListener(object : AbsListView.OnScrollListener {
            override fun onScroll(view: AbsListView?, first: Int, visibleCount: Int, count: Int) {
                //ListView의 스크롤 위치를 저장한다
                listPosition = first
                listPositionTop = listView.listPaddingTop
            }

            override fun onScrollStateChanged(view: AbsListView?, state: Int) {

            }

        })

        return view
    }

 

 

 

 

도움이 되셨다면~ 정성으로 빚은 저희 앱!  많은 이용 바래요:)

 

https://meorimal.com/index.html?tab=spaceship

 

우주선 - 방치형 인공지능 투자 체험기

미리 맛보는 인공지능 투자!

(주)머리말 meorimal.com

 

https://meorimal.com/subway.html

 

지하철어디있니

더이상 고민하지 마세요. 뛸지 말지 딱 보면 알죠.

(주)머리말 meorimal.com

 

사업자 정보 표시
주식회사 머리말 | 고영진 | 서울특별시 송파구 중대로 135 서관 10층 (가락동, 아이티벤처타워) | 사업자 등록번호 : 524-88-00727 | TEL : 010-9990-3674 | Mail : gyjmeba@hanmail.net | 통신판매신고번호 : 2017-서울강남-03941호 | 사이버몰의 이용약관 바로가기