Android

어플 만들기 : 페이징(스크롤) 처리를 가능하게 하는 코드 작성하기

567Rabbit 2024. 6. 12. 17:14

https://codebunny99.tistory.com/164

 

유튜브 API 키워드 검색하면 키워드에 맞는 게시물을 가져오는 app개발

https://codebunny99.tistory.com/163 유튜브 데이터 API를 Postman(포스트맨)으로 사용하는 방법https://console.cloud.google.com/welcome/new?hl=ko&project=eastern-surface-426200-r0&supportedpurview=project Google 클라우드 플랫폼로

codebunny99.tistory.com

 

이 어플리케이션을 베이스로 하여 코드를 작성하였다.

 

 

 

 

MainActivity 안에 작성한다

 

1. recyclerView 쌍 밑 위치에 //스크롤 처리 ~ 코드 를작성한다

 

 

 

// 스크롤 처리를 위한 코드
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();
        }
    }
});

 

 

 

 

 

2. 포스트맨에서 nextPageToken을 사용하는 것을 확인한다.

 

 

 

 

 

3. MainActivity에서 nextPageToken 파싱 부분을 추가해준다.

 

 

멤버변수에 추가하기

 

 

 

nextPageToken을 기존의 파싱에 추가해 파싱해준다.

 

 

 

 

4. MainActivity에 addNetworkData() 함수 만들어주기(Create)

 

 

 

누르면, 아래와 같은 위치에 함수가 만들어지는데, 아래와 같이 nextPageToken 부분을 추가로 작성해준다

 

// 추가로 20개씩을 더 호출할 때 사용하는 함수
    private void addNetworkData() {

        progressBar.setVisibility(View.VISIBLE);

        // 유튜브 API를 호출해서 데이터를 받아온다
        RequestQueue queue = Volley.newRequestQueue(MainActivity.this);

        String url = "https://www.googleapis.com/youtube/v3/search?key="
                + Config.YoutubeKey
                + "&part=snippet&maxResults=20&type=video&order=date&q="
                + keyword
                + "&pageToken=" + nextPageToken;

 

 

 

 

아래부터는 기존에 생성한 onCreate 함수에서 복사하여 그대로 붙여넣기 한 후에 url을 위에 생성하였기 때문에

 

url이라고 바꿔준 뒤에,

        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 items = response.getJSONArray("items");

                            for (int i = 0; i < items.length(); i++) {
                                JSONObject data = items.getJSONObject(i);
                                JSONObject id = data.getJSONObject("id");
                                String videoId = id.getString("videoId");
                                JSONObject snippet = data.getJSONObject("snippet");
                                String title = snippet.getString("title");
                                String description = snippet.getString("description");

                                JSONObject thumbnails = snippet.getJSONObject("thumbnails");
                                JSONObject medium = thumbnails.getJSONObject("medium");
                                String thumbUrl = medium.getString("url");

                                JSONObject high = thumbnails.getJSONObject("high");
                                String url = high.getString("url");

                                Youtube youtube = new Youtube(videoId, title, description, thumbUrl, url);
                                YoutubeArrayList.add(youtube);
                            }

                            adapter.notifyDataSetChanged();

                        } catch (JSONException e) {
                            Toast.makeText(MainActivity.this, "파싱 에러", Toast.LENGTH_SHORT).show();
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        // 프로그레스 바를 유저의 눈에서 사라지게 하는 코드
                        progressBar.setVisibility(View.GONE);

                        Toast.makeText(MainActivity.this, "네트워크 통신 에러", Toast.LENGTH_SHORT).show();
                    }
                }
        );

        queue.add(request);

 

 

 

중간에 //삭제할 부분은 삭제해주고, //추가할 부분은 삭제한 그 자리에 새로운 어댑터를 추가해주면 된다.

// 삭제할 부분
YoutubeArrayList.clear();  // 기존 데이터 초기화

adapter = new YoutubeAdapter(MainActivity.this, YoutubeArrayList);
recyclerView.setAdapter(adapter);

// 추가할 부분
adapter.notifyDataSetChanged();

 

 

 

 

+

<Retrofit2 라이브러리>

 

4번 대신에 MainActivity에 이 부분을 작성해준다.

private void addNetworkData() {

        progressBar.setVisibility(View.VISIBLE);

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

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

        Call<PostingList> call = api.getPostingList("Bearer " + token, offset, limit );

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

                if(response.isSuccessful()){
                    PostingList postingList = response.body();

                    count = postingList.count;

                    offset = offset + count;

                    postingArrayList.addAll( postingList.items );

                    adapter.notifyDataSetChanged();

                }else{

                }
            }