// 페이징 처리
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();
위 코드(초기화)를 추가 해야 한다.
'Android Studio' 카테고리의 다른 글
[Android Studio] AlertDialog array로 사용하기 (0) | 2024.01.05 |
---|---|
[Android Studio] Retrofit2 라이브러리를 이용할 CRUD 기능 처리 API 인터페이스 예시 (0) | 2024.01.05 |
[Android Studio] Retrofit2 라이브러리를 이용해 RecyclerView 화면 처리하기 (0) | 2024.01.04 |
[Android Studio] 유저에게 날짜 / 시간 정보 입력받기 DatePickerDialog(), TimePickerDialog() + 받아올 때 문자열 가공 (1) | 2024.01.04 |
[Android Studio] Retrofit2 통신 시 상태 코드에 따른 코드 작성법 (1) | 2024.01.04 |