대부분의 앱은 탭과 리스트로 구성된다. 많은 정보를 간편하면서도 체계적으로 보여줄수 있기 때문이다.
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
https://meorimal.com/subway.html
사업자 정보 표시
주식회사 머리말 | 고영진 | 서울특별시 송파구 중대로 135 서관 10층 (가락동, 아이티벤처타워) | 사업자 등록번호 : 524-88-00727 | TEL : 010-9990-3674 | Mail : gyjmeba@hanmail.net | 통신판매신고번호 : 2017-서울강남-03941호 | 사이버몰의 이용약관 바로가기
'개발 > android' 카테고리의 다른 글
날짜 텍스트에 일수를 더해보자 (0) | 2020.01.31 |
---|---|
drawText의 문자가 밑으로 삐져나오지 않게 하기 (0) | 2019.06.24 |
객체 속도가 빠를수록 충돌검사가 부정확해진다면 (0) | 2019.04.02 |
Dialog를 닫았는데 background로 나갔다 들어오니 다시 열린다??? (0) | 2019.03.13 |
EditText에 자동으로 단위 콤마 넣기 (0) | 2019.01.17 |