개발학습일지

[Android Studio] nextPageToken을 이용한 Scroll paging 처리 방법 본문

Android Studio

[Android Studio] nextPageToken을 이용한 Scroll paging 처리 방법

처카푸 2024. 6. 12. 17:11

nextPageToken을 이용한 Scroll paging 처리 방법

 

오픈 API로 데이터를 받아오는데,

20개씩 가져오도록 지정하지만, 스크롤하면 계속 새로운 정보들이 보이도록 만들고 싶다.

 

그래서,

오픈 API가 보내주는 nextPageToken을 이용해서 페이징 처리를 해준다.

 

1. 원하는 해당 액티비티의 onCreate 함수 안에 스크롤 처리를 위한 코드를 작성한다.

        // 스크롤 처리를 위한 코드
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
			
            // 자동으로 오버라이드 되는 함수 2가지 
            // 위에는 사용하지 X
            @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()).findLastVisibleItemPosition();
                int totalCount = recyclerView.getAdapter().getItemCount();

                if(lastPosition + 1 == totalCount){
                    //네트워크로부터 데이터를 추가로 받아 온다.
                    addNetworkData();
                }
            }
        });

 

2. 네트워크로부터 데이터를 추가로 받아오는 함수를 만든다.

- 여기서 만들다 보면 nextPageToken 값이 필요하다.

  첫 번째 호출하는 곳에서 nextPageToken 값을 파싱 한다. (멤버 변수로 만들어야 한다.)

nextPageToken = response.getString("nextPageToken");

- 함수 만들기

    // 추가로 호출하는 내가 만든 함수 addNetworkData()
    private void addNetworkData() {
        progressBar.setVisibility(View.VISIBLE);
        
        // 지금 받아 온 것에 추가로 받아오는 함수여서,
        // 처음 받아 오는 함수와 다르게 클리어를 쓰지 않는다.
        // searchDataArrayList.clear();
		
        // 네트워크 불러오기
        RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
		
        // url 변수로 만들기 key값은 config 파일로 관리한다.
        // 추가로 받아오는 파라미터 pageToken= 작성
        String url = "https://www.googleapis.com/youtube/v3/search?key="+
                Config.YOUTUBE_KEY +
                "&part=snippet&maxResults=20&order=date&q="+ searchWord +
                "&type=video&pageToken=" + nextPageToken;
		
        // 추가에 추가로 받아 올 수 있기때문에 nextPageToken은 계속 가져온다.
        JsonObjectRequest request = new JsonObjectRequest(
                Request.Method.GET,
                url,
                null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        progressBar.setVisibility(View.GONE);
                        
                        Log.i("SEARCH MAIN", response.toString());

                        try {
                            String kind = (String) response.get("kind");

                            // 추가로 호출할 때 필요한 코드
                            nextPageToken = response.getString("nextPageToken");

                            JSONArray items = response.getJSONArray("items");
                            for(int i = 0 ; i < items.length() ; i++){
                                JSONObject item = items.getJSONObject(i);
                                JSONObject id = item.getJSONObject("id");
                                String videoId = id.getString("videoId");
                                JSONObject snippet = item.getJSONObject("snippet");
                                String title = snippet.getString("title");
                                String description = snippet.getString("description");
                                JSONObject thumbnails = snippet.getJSONObject("thumbnails");
                                JSONObject mediumUrl = thumbnails.getJSONObject("medium");
                                JSONObject highUrl = thumbnails.getJSONObject("high");
                                String imgMedium = mediumUrl.getString("url");
                                String imgHigh = highUrl.getString("url");

                                SearchData searchData = new SearchData(videoId, title, description, imgMedium, imgHigh);

                                searchDataArrayList.add(searchData);
                            }
                            adapter.notifyDataSetChanged();

                        } catch (JSONException e) {
                            progressBar.setVisibility(View.GONE);
                            Toast.makeText(MainActivity.this, "파싱 에러 : " + e.toString(), Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        progressBar.setVisibility(View.GONE);
                        Toast.makeText(MainActivity.this, "네트워크 통신 에러 : " + error.toString(), Toast.LENGTH_SHORT).show();
                        Log.i("SEARCH MAIN", error.toString());
                        return;
                    }
                }
        );
        queue.add(request);
    }