본문 바로가기
Aandroid Studio/기능

[android] 페이징 api데이터 스크롤 내려서 추가로 출력하기

by 코끼리똥11 2024. 6. 12.

on create 함수에 recyclerView.addOnScrollListener 함수를 추가한 후 오버라이드 를 필수로 작성한 후 

addNetworkData() 함수를 호출한다.

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 lastpositon=((LinearLayoutManager)recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
        int totalCount = recyclerView.getAdapter().getItemCount();

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

    }

});

addNetworkData()

private void addNetworkData() {
    progressBar.setVisibility(View.VISIBLE);
    RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
    // 2. request 만든다.
    String url = "https://www.googleapis.com/youtube/v3/search?key="+Config.YOUYUBE_KEY+
    "&part=snippet&maxResults=20&order=date&q="+text+"&type=video"+"&pageToken"+nextPageToken;
    JsonObjectRequest request = new JsonObjectRequest(
            Request.Method.GET,
            url,
            null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    progressBar.setVisibility(View.GONE);

                    try {
                        nextPageToken = response.getString("nextPageToken");
                        JSONArray dataArray = response.getJSONArray("items");
                        for (int i = 0; i < dataArray.length(); i++) {
                            JSONObject item = dataArray.getJSONObject(i);
                            JSONObject snippet = item.getJSONObject("snippet");
                            String title = snippet.getString("title");
                            String body = snippet.getString("description");
                            JSONObject thumbnails = snippet.getJSONObject("thumbnails");
                            JSONObject thumbnail = thumbnails.getJSONObject("default");
                            JSONObject high = thumbnails.getJSONObject("high");
                            String url2 = high.getString("url");
                            String url = thumbnail.getString("url");

                            JSONObject ids = item.getJSONObject("id");
                            String id=ids.getString("videoId");




                            Posting posting = new Posting(title, body, url, id, url2);
                            postingArrayList.add(posting);
                            Log.i("MAIN",postingArrayList.toString());

                        }

                        adapter = new PostingAdapter(MainActivity.this, postingArrayList);

                        recyclerView.setAdapter(adapter);



                    } catch (JSONException e) {
                        Toast.makeText(MainActivity.this,
                                "파싱 에러",
                                Toast.LENGTH_SHORT).show();
                        Log.i("EMPLOYER MAIN", e.toString());
                        return;
                    }

                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {

                    progressBar.setVisibility(View.GONE);

                    Toast.makeText(MainActivity.this,
                            "네트워크 통신 에러",
                            Toast.LENGTH_SHORT).show();
                    Log.i("EMPLOYER MAIN", error.toString());
                }
            }
    );
    // 3. 네트워크로 API 호출
    queue.add(request);




}

url에 pageToken 파라미터를 추가한다. 토큰은

api 호출할때 알 수 있다.