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);
}
- 처음 데이터 가져오는 함수에서 nextPageToken 값을 받아와 전역변수로 저장해놓고
- 페이징 처리 할 때 가져와 url의 파라미터에 추가한다. 네트워크 통신을 해 어레이리스트에 다 추가한 후에
- adapter.notifyDataSetChanged() 로 수정된 내용을 반영한다.
'Android Studio' 카테고리의 다른 글
[Android Studio] Volley 라이브러리로 통신 시 Header에 데이터 세팅하는 방법 (1) | 2024.01.03 |
---|---|
[Android Studio] Volley 라이브러리를 이용한 POST 통신 방법 (body에 json 보내기) (2) | 2024.01.03 |
[Android Studio] 안드로이드에서 YouTube API 사용하기전 세팅하기(API 키 생성) (0) | 2024.01.02 |
[Android Studio] Intent로 다른 액티비티 띄우기(연락처 선택, 웹브라우저 실행, SMS/Email 작성, 텍스트 공유) (0) | 2024.01.02 |
[Android Studio] 이미지 처리를 위한 Glide 라이브러리 사용하기 (1) | 2024.01.02 |