📝리사이클러뷰 페이징 처리하기
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);
}
}
'Android Studio' 카테고리의 다른 글
[Android Studio] 네트워크를 통해서 로직처리를 할때 보여주는 프로그레스 다이얼로그 만들기 (0) | 2023.02.09 |
---|---|
[Android Studio] ArrayList 객체 Intent로 전달하기 (0) | 2023.02.08 |
[Android Studio] 안드로이드에서 YouTube API 사용하기전 셋팅하기(API 키 생성) (0) | 2023.02.07 |
[Android Studio] Intent로 다른 액티비티 띄우기(연락처 선택, 웹브라우저 실행, SMS/Email 작성) (0) | 2023.02.07 |
[Android Studio] 이미지 로딩하기 위한 Glide 라이브러리 사용하기 (0) | 2023.02.07 |
댓글