작업 일지

[Android] 리스트에서 아이템 삭제 후 페이징할 때 조심할 점

O_Gyong 2023. 1. 2. 17:57

RecyclerView의 addOnScrollListener를 사용해서 리스트의 마지막 위치가 표시될 때

다음 페이지에 대한 정보를 서버에 요청하여 페이징 작업을 하였다.

 

문제는 리스트에서 아이템을 삭제하고 다음 페이지에 대한 정보를 서버에 요청하면

아이템 하나가 사라지는 일이 생겼다.

DB에 15개의 아이템이 있고, 1페이지에 5개씩 보인다고 가정하자.

4번 아이템을 삭제하게 되면 DB에 저장된 데이터는 아래 이미지처럼 변하게 된다.

여기서 문제가 발생한다.

4번을 삭제하고 2페이지를 호출하면 7~11까지의 아이템이 호출되어 6번 아이템을 볼 수가 없다.

11번 아이템 안보임


삭제 api를 호출하여 아이템이 삭제되면 현재 페이지에 대한 리스트를 다시 호출을 한다.

현재 페이지에 추가된 마지막 값을 꺼내서 기존 리스트에 붙여준다.

 

이때 현재 페이지가 마지막 페이지인지, 삭제 api를 호출했는지 판별할 수 있는 변수 두 개가 필요하다.

 

// 리스트 호출 결과
mViewModel.getListResult.observe(viewLifecycleOwner, Observer {
    /**
     * 생략
     */

    // 마지막 페이지가 아니고 삭제가 호출됐으면 마지막 아이템을 리스트에 추가
    if(!isLastPage && isDeleteCall){
        mList.add(result.success.list.last())
        mAdapter.addData(mList, 1)

        isDeleteCall = false
        this.hideLoading()
        return@Observer
    }
})

// 아이템 삭제 결과
mViewModel.getItemDeleteResult.observe(viewLifecycleOwner, Observer {
    /**
     * 생략
     */
     
    // 마지막 페이지가 아니면 현재 리스트 호출해서 마지막 아이템만 꺼내와야 함
    if(!isLastPage && isDeleteCall){
        mViewModel.requestGetCarNotifyResult(page)
    }
})