Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

모바일 앱(안드로이드)

안드로이드 앱 만들기 : Paging 처리의 오해(?)

Billcorea 2023. 10. 30. 18:03
반응형

https://billcorea.tistory.com/381

 

안드로이드 앱 만들기 : Sqlite 로 구현해 보는 Paging (feat Jetpack compose, 대량 데이터 조회)

오늘 적어 두고자 하는 주제는 Paging입니다. 웹 개발을 하는 경우에는 각종 framework 등을 이용해서 데이터 조회 시 UI의 부하를 줄이기 위해서 Paging을 할 수 있도록 지원을 받습니다. xml layout 을 구

billcorea.tistory.com

이전 글에서 말했던 페이지 처리의 오류가 발견되었습니다 ㅋ~  사유는  데이터의 개수가 페이징을 할 수 있는 기본 건수보다 작은 경우 오류가 발생하는 것을 확인하게 되었습니다.

 

조치 

페이지 처리의 클래스를 수정 하였습니다. 

 

class ListViewSource(pContext : Context) : PagingSource<Int, ViewReceiveList>() {

    val context = pContext

    override fun getRefreshKey(state: PagingState<Int, ViewReceiveList>): Int? {
        return state.anchorPosition
    }

    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, ViewReceiveList> {

        return try {
            val nextPage = params.key ?: 1
            val viewList = dataReadPage(nextPage, params.loadSize)
            val loadOver = params.loadSize < viewList.size // 페이지 건수 보다 많은 데이터가 있나 ?
            LoadResult.Page(
                data = viewList,
                prevKey = if (nextPage == 1) null else viewList[0].id.toInt(),
                nextKey = if (viewList.isEmpty()) null
                            else if (!loadOver) null // 데이터 건수가 작은 경우는 다음 페이지는 없기 떄문에 
                            else viewList[viewList.size - 1].id.toInt()
            )
        } catch (e : IOException) {
            return LoadResult.Error(e)
        }
    }

    @SuppressLint("Range")
    private fun dataReadPage(nextPage: Int, loadSize: Int): List<ViewReceiveList> {
        val returnList = ArrayList<ViewReceiveList>()
        val dbHandler = DBHandler.open(context)
        Log.e("", "readKey=$nextPage")
        val rs = dbHandler.selectRcvList(nextPage, loadSize)
        returnList.clear()
        while (rs.moveToNext()) {
            val viewRevList = ViewReceiveList()
            viewRevList.id = rs.getString(rs.getColumnIndex("_id"))
            viewRevList.strBody = rs.getString(rs.getColumnIndex("strBody"))
            viewRevList.chkValue = rs.getString(rs.getColumnIndex("chkValue"))
            viewRevList.regDate= rs.getString(rs.getColumnIndex("regDate"))
            viewRevList.eventID = rs.getString(rs.getColumnIndex("eventID"))
            viewRevList.inPhoneNumber = rs.getString(rs.getColumnIndex("inPhoneNumber"))
            viewRevList.kakaoProfileImage = rs.getString(rs.getColumnIndex("kakao_profile_image"))
            returnList.add(viewRevList)
        }
        dbHandler.close()
        return returnList
    }
}

이런 것 수정하는 방법으로 데이터 표기가 되고 있는 것을 확인하게 되었습니다.  앱 사용에 불편을 드려 죄송합니다. 

ㅠㅠ;;

 

샘플페이지

 

 

p.s : 2024.03.20 ~~~ 이제 서야 알게된 사실은 ... 이 방법으로는 1페이지이 데이터만 나오고 그 다음은 나오지 않고 있다는 사실을 알게 되었습니다. ㅠㅠ;;  이후 정리가 되면 다시 게시글로 정리를 해 보겠습니다.

반응형