본문 바로가기
Android Studio

[Android Studio] RecyclerView 페이징 처리하기

by dong_su 2024. 1. 3.

YouTube API를 이용해 입력받은 검색어를 유튜브에 검색해서 관련 영상의 타이틀과 내용, 썸네일을 가져오는 중에,

리사이클러뷰는 25개까지 표시하고 맨 밑까지 내려갔을때 추가로 가져올 수 있게 페이징 처리하는 코드를 작성했다.

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
    }

    @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        // 맨 마지막 데이터가 화면에 나타나면
        // 네트워크 통해서 데이터를 추가로 받아오고 화면에 표시
        int lastPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
        int totalCount = recyclerView.getAdapter().getItemCount();

        // 스크롤을 맨 끝까지 한 상태 체크
        if (lastPosition+1 == totalCount){
            addNetworkData();
        }
    }
});

onCreate 함수 안에 recyclerView 세팅해논 부분에 작성한다. 

유지보수를 위해 addNetworkData()라는 함수를 따로 만들어서 호출한다.

 

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

    RequestQueue queue = Volley.newRequestQueue(MainActivity.this);

    // 페이징처리해서 추가로 가져오는 것이므로 pageToken 파라미터가 있어야 한다.
    String url = Config.SEARCH_URL + "?key=" + Config.GOOGLE_API_KEY + "&maxResults=20&type=video&part=snippet&q=" + keyword + "&order=date&pageToken=" + pageToken;

    JsonObjectRequest request = new JsonObjectRequest(
            Request.Method.GET,
            url,
            null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    progressBar.setVisibility(View.GONE);
                    try {
                        pageToken = response.getString("nextPageToken");
                        JSONArray items = response.getJSONArray("items");
                        for (int i=0; i<items.length(); i++){
                            String videoId = items.getJSONObject(i).getJSONObject("id").getString("videoId");
                            String title = items.getJSONObject(i).getJSONObject("snippet").getString("title");
                            String description = items.getJSONObject(i).getJSONObject("snippet").getString("description");
                            String mediumUrl = items.getJSONObject(i).getJSONObject("snippet").getJSONObject("thumbnails").getJSONObject("medium").getString("url");
                            String highUrl = items.getJSONObject(i).getJSONObject("snippet").getJSONObject("thumbnails").getJSONObject("high").getString("url");

                            Video video = new Video(videoId, title, description, mediumUrl, highUrl);
                            videoArrayList.add(video);
                        }
                    } catch (JSONException e) {
                        Toast.makeText(MainActivity.this, "파싱 에러", Toast.LENGTH_SHORT).show();
                        return;
                    }
                    adapter.notifyDataSetChanged();
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    progressBar.setVisibility(View.GONE);
                    return;
                }
            }
    );

    queue.add(request);
}
  1. 처음 데이터 가져오는 함수에서 nextPageToken 값을 받아와 전역변수로 저장해놓고
  2. 페이징 처리 할 때 가져와 url의 파라미터에 추가한다. 네트워크 통신을 해 어레이리스트에 다 추가한 후에
  3. adapter.notifyDataSetChanged() 로 수정된 내용을 반영한다.