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{
ââââââââââââââââ}
ââââââââââââ}