본문 바로가기
Android Studio

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

by coding_su 2023. 2. 8.

📝리사이클러뷰 페이징 처리하기

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

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

public class MainActivity extends AppCompatActivity {

    EditText editSearch;
    ImageView imgSearch;
    ProgressBar progressBar;
    RecyclerView recyclerView;
    VideoAdapter adapter;
    ArrayList<Video> videoList = new ArrayList<>();
    String keyword;
    String pageToken;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editSearch = findViewById(R.id.editSearch);
        imgSearch = findViewById(R.id.imgSearch);
        progressBar = findViewById(R.id.progressBar);

        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
        
        // 리사이클러뷰 스크롤 처리
        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();
                }
            }
        });
        
        // 이미지뷰 클릭하면 해당검색어로 유튜브에 검색한 결과값 가져오기
        imgSearch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                keyword = editSearch.getText().toString().trim();

                if (keyword.isEmpty()) {
                    return;
                }
                // 네트워크 통해서 데이터 받아와서 화면에 표시하는 함수 호출
                getNetworkData();
            }
        });
    }

    private void getNetworkData() {
        String URL = Config.BASE_URL + Config.PATH+"?key="+Config.API_KEY+"&part=snippet&q="+keyword+"&maxResults=20&type=video";

        RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
        JsonObjectRequest request = new JsonObjectRequest(
                Request.Method.GET, URL, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
            
                // 검색어를 바꿀 수 있으니 검색 버튼을 클릭할때마다 리스트를 비워주고 토큰값도 없애준다
                videoList.clear();
                pageToken = null;
                
                try {
                    progressBar.setVisibility(View.GONE);
                    pageToken = response.getString("nextPageToken");

                    JSONArray responseData = response.getJSONArray("items");
                    for (int i = 0; i < responseData.length(); i++) {
                        JSONObject data = responseData.getJSONObject(i);

                        JSONObject idData = data.getJSONObject("id");
                        JSONObject snippetData = data.getJSONObject("snippet");
                        JSONObject thumbnailsData = snippetData.getJSONObject("thumbnails");
                        JSONObject mediumData = thumbnailsData.getJSONObject("medium");
                        JSONObject highData = thumbnailsData.getJSONObject("high");

                        Video video = new Video(idData.getString("videoId"), snippetData.getString("title"), snippetData.getString("description"),
                                mediumData.getString("url"), highData.getString("url"));

                        videoList.add(video);
                    }

                } catch (JSONException e) {
                    return;
                }

                // 재검색했을때는 리사이클러뷰 갱신만하게 if문 입력
                if (adapter == null) {
                    adapter = new VideoAdapter(MainActivity.this, videoList);
                    recyclerView.setAdapter(adapter);                    
                } else {
                    adapter.notifyDataSetChanged();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                progressBar.setVisibility(View.GONE);
                Toast.makeText(MainActivity.this, "서버에러발생", Toast.LENGTH_SHORT).show();
            }
        }
        );
        progressBar.setVisibility(View.VISIBLE);
        queue.add(request);
    }

    private void addNetworkData() {
        String URL = Config.BASE_URL + Config.PATH+"?key="+Config.API_KEY+"&part=snippet&q="+keyword+"&maxResults=20&type=video&pageToken="+pageToken;

        RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
        JsonObjectRequest request = new JsonObjectRequest(
                Request.Method.GET, URL, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    progressBar.setVisibility(View.GONE);
                    pageToken = response.getString("nextPageToken");

                    JSONArray responseData = response.getJSONArray("items");
                    for (int i = 0; i < responseData.length(); i++) {
                        JSONObject data = responseData.getJSONObject(i);

                        JSONObject idData = data.getJSONObject("id");
                        JSONObject snippetData = data.getJSONObject("snippet");
                        JSONObject thumbnailsData = snippetData.getJSONObject("thumbnails");
                        JSONObject mediumData = thumbnailsData.getJSONObject("medium");
                        JSONObject highData = thumbnailsData.getJSONObject("high");

                        Video video = new Video(idData.getString("videoId"), snippetData.getString("title"), snippetData.getString("description"),
                                mediumData.getString("url"), highData.getString("url"));

                        videoList.add(video);
                    }

                } catch (JSONException e) {
                    return;
                }
                // 기존 화면에 연결되서 나오게 리사이클러뷰 화면 갱신
                adapter.notifyDataSetChanged();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                progressBar.setVisibility(View.GONE);
                Toast.makeText(MainActivity.this, "서버에러발생", Toast.LENGTH_SHORT).show();
            }
        }
        );
        progressBar.setVisibility(View.VISIBLE);
        queue.add(request);
    }
}

 

댓글