본문 바로가기
Android Studio

[Android Studio] Retrofit2 이용할 때 페이징 처리 하는 방법

by dong_su 2024. 1. 5.
// 페이징 처리
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        // 현재 리사이클러뷰에 보이는 마지막 요소(카드뷰)의 인덱스
        int lastPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastVisibleItemPosition();
        // 현재 리사이클러뷰에 보이는 요소의 총 개수
        int totalCount = recyclerView.getAdapter().getItemCount();

        if (lastPosition+1 == totalCount){
            // 마지막 요청 이후 네트워크 낭비 안하기 위한 조건
            // 마지막 요청 완료 하면 limit > count 되거나 오류가 뜨기 때문에 함수 실행 안됨
            if(limit == count){
                addNetworkData();
            }
        }
    }
});

oncreate() 함수 안에 recyclerView 변수처리 근처에 위 코드 작성한다.

 

private void addNetworkData() {
        progressBar.setVisibility(View.VISIBLE);

        Retrofit retrofit = NetworkClient.getRetrofitClient(MainActivity.this);

        MemoApi api = retrofit.create(MemoApi.class);

        SharedPreferences sp = getSharedPreferences(Config.PREFERENCE_NAME, MODE_PRIVATE);
        String token = sp.getString("token", "");
        token = "Bearer " + token;

        // 함수 실행때 마다 서버에서 준 개수만큼 더 한다.
        offset += count;
        Call<MemoList> call = api.getMemoList(token, offset, limit);

        call.enqueue(new Callback<MemoList>() {
            @Override
            public void onResponse(Call<MemoList> call, Response<MemoList> response) {
                progressBar.setVisibility(View.GONE);

                if (response.isSuccessful()){
                    MemoList memoList = response.body();
                    memoArrayList.addAll(memoList.items);

                    // count에 서버에서 준 개수로 초기화(마지막 데이터 개수는 다를 수 있으니까)
                    count = memoList.count; 

                    adapter.notifyDataSetChanged();

                } else if (response.code() == 500) {
                    Snackbar.make(btnAdd, "DB 오류", Snackbar.LENGTH_SHORT).show();
                    return;
                } else if (response.code() == 400) {
//                    Snackbar.make(btnAdd, "마지막 메모입니다.", Snackbar.LENGTH_SHORT).show();
                    return;
                } else {
                    Snackbar.make(btnAdd, "잠시 후 이용하세요.", Snackbar.LENGTH_SHORT).show();
                    return;
                }
            }

            @Override
            public void onFailure(Call<MemoList> call, Throwable t) {
                progressBar.setVisibility(View.GONE);
                return;
            }
        });
    }

위 코드가 정상 작동 하려면 맨 처음 메인 액티비티가 create될 때,

리스트 가져오는 getNetworkData() 함수의 onResponse() 안에 성공한 경우에

offset = 0;
count = 0;
memoArrayList.clear();

위 코드(초기화)를 추가 해야 한다.