package com.minui.youtube;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.widget.NestedScrollView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.minui.youtube.adapter.YoutubeAdapter;
import com.minui.youtube.model.Youtube;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    YoutubeAdapter adapter;
    ArrayList<Youtube> youtubeList;
    ProgressBar progressBar;
    EditText editSearch;
    ImageView imgSearch;
    String pageToken = null;
    String keyword;

    final String URL = "https://www.googleapis.com/youtube/v3/search?part=snippet&key=AIzaSyDmItl5QNonjtpgje3I2jyCP6gDV-7wbOo&q=";

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

        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) {
                    if (pageToken == null) {
                        return;
                    }
                    String apiUrl;

                    keyword = editSearch.getText().toString().trim();


                    apiUrl = URL + keyword + "&maxResults=20&pageToken=" + pageToken;

                    RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
                    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, apiUrl , null, new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
                            try {
                                JSONArray jsonArr = response.getJSONArray("items");
                                if (response.has("nextPageToken")) {
                                    pageToken = response.getString("nextPageToken");
                                }

                                for(int i=0;i<jsonArr.length();i++){

                                    JSONObject jsonObj = jsonArr.getJSONObject(i);
                                    JSONObject snippet = jsonObj.getJSONObject("snippet");
                                    JSONObject thumbnails = snippet.getJSONObject("thumbnails");
                                    JSONObject id = jsonObj.getJSONObject("id");
                                    JSONObject defaultThumb = thumbnails.getJSONObject("default");
                                    JSONObject bigThumb = thumbnails.getJSONObject("medium");

                                    Youtube youtube = new Youtube(snippet.getString("title"), snippet.getString("description"), defaultThumb.getString("url"), bigThumb.getString("url"), id.getString("videoId"));
                                    youtubeList.add(youtube);

                                }

                            } catch (JSONException e) {
                                Toast.makeText(getApplicationContext(), "네트워크 에러입니다.", Toast.LENGTH_SHORT).show();
                                return;
                            } finally {
                                progressBar.setVisibility(View.INVISIBLE);
                            }

                            adapter.notifyDataSetChanged();

                        }
                    }, null);
                    progressBar.setVisibility(View.VISIBLE);
                    requestQueue.add(jsonObjectRequest);
                }
            }
        });

        youtubeList = new ArrayList<>();
        progressBar = findViewById(R.id.progressBar);
        editSearch = findViewById(R.id.editSearch);
        imgSearch = findViewById(R.id.imgSearch);

        imgSearch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String apiUrl;

                keyword = editSearch.getText().toString().trim();
                apiUrl = URL + keyword + "&maxResults=20";

                youtubeList.clear();
                if (adapter != null){
                    adapter.notifyDataSetChanged();
                }

                RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
                JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, apiUrl , null, new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            JSONArray jsonArr = response.getJSONArray("items");
                            if (response.has("nextPageToken")) {
                                pageToken = response.getString("nextPageToken");
                            }

                            for(int i=0;i<jsonArr.length();i++){

                                JSONObject jsonObj = jsonArr.getJSONObject(i);
                                JSONObject snippet = jsonObj.getJSONObject("snippet");
                                JSONObject thumbnails = snippet.getJSONObject("thumbnails");
                                JSONObject id = jsonObj.getJSONObject("id");
                                JSONObject defaultThumb = thumbnails.getJSONObject("default");
                                JSONObject bigThumb = thumbnails.getJSONObject("medium");

                                Youtube youtube = new Youtube(snippet.getString("title"), snippet.getString("description"), defaultThumb.getString("url"), bigThumb.getString("url"), id.getString("videoId"));
                                youtubeList.add(youtube);

                            }

                        } catch (JSONException e) {
                            Toast.makeText(getApplicationContext(), "네트워크 에러입니다.", Toast.LENGTH_SHORT).show();
                            return;
                        } finally {
                            progressBar.setVisibility(View.INVISIBLE);
                        }

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

                    }
                }, null);
                progressBar.setVisibility(View.VISIBLE);
                requestQueue.add(jsonObjectRequest);
            }
        });

    }
}

recyclerView.addOnScrollListener를 작성하고

onScrolled 안의 조건문에서 스크롤 맨 끝 일때 데이터를 불러오면 된다.

+ Recent posts