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 안의 조건문에서 스크롤 맨 끝 일때 데이터를 불러오면 된다.
'안드로이드' 카테고리의 다른 글
안드로이드 Retrofit2 라이브러리 사용을 위한 설정 방법 (0) | 2022.07.21 |
---|---|
안드로이드 카메라 설정 (0) | 2022.07.21 |
안드로이드 이미지 처리를 위한 Glide 라이브러리 사용법 (0) | 2022.07.20 |
안드로이드 FloatingActionButton 만들기 (0) | 2022.07.19 |
안드로이드 ActionBar menu 사용하는 방법 (0) | 2022.07.19 |