1. build.gradle 추가
2. AndroidManifest.xml
- Internet Permission 추가하기
3. activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btnData"
android:text="데이터 불러오기"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
4. item_recycler_view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="35dp">
<TextView
android:id="@+id/textView1"
style="@style/recyclerview_contents"
android:text="영화이름" />
<TextView
android:id="@+id/textView2"
style="@style/recyclerview_contents"
android:text="누적관객수" />
<TextView
android:id="@+id/textView3"
style="@style/recyclerview_contents"
android:text="영화개봉일" />
</LinearLayout>
5. styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--리사이클러뷰 contents-->
<style name="recyclerview_contents" >
<item name="android:layout_weight">1.5</item>
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:gravity">center</item>
<item name="android:layout_marginTop">15dp</item>
<item name="android:textColor">@color/black</item>
<item name="android:textSize">14dp</item>
</style>
</resources>
6. Data.java (model)
package com.example.openapi_recyclerview;
public class Data {
private String movieNm; // 영화이름
private String audiAcc; // 누적관객수
private String openDt; // 영화개봉일
public String getMovieNm() {return movieNm;}
public void setMovieNm(String movieNm) {this.movieNm = movieNm;}
public String getAudiAcc() {return audiAcc;}
public void setAudiAcc(String audiAcc) {this.audiAcc = audiAcc;}
public String getOpenDt() {return openDt;}
public void setOpenDt(String openDt) {this.openDt = openDt;}
public Data(String movieNm, String audiAcc, String openDt) {
this.movieNm = movieNm;
this.audiAcc = audiAcc;
this.openDt = openDt;
}
public Data () {
this.movieNm = movieNm;
this.audiAcc = audiAcc;
this.openDt = openDt;
}
}
7. RecyclerAdapter.java
package com.example.openapi_recyclerview;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private ArrayList<Data> mData = new ArrayList<>();
// 아이템 뷰를 저장하는 viewholder 클래스
public class ViewHolder extends RecyclerView.ViewHolder {
TextView textView1; // 영화이름
TextView textView2; // 누적관객수
TextView textView3; // 영화개봉일
public ViewHolder(@NonNull View itemView) {
super(itemView);
textView1 = itemView.findViewById(R.id.textView1);
textView2 = itemView.findViewById(R.id.textView2);
textView3 = itemView.findViewById(R.id.textView3);
}
void onBind(Data data1) {
textView1.setText(data1.getMovieNm());
textView2.setText(data1.getAudiAcc());
textView3.setText(data1.getOpenDt());
}
}
// 아이템 뷰를 위한 뷰홀더 객체를 생성하여 return
@NonNull
@Override
public RecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Context context = parent.getContext();
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.item_recycler_view, parent, false);
RecyclerAdapter.ViewHolder viewHolder = new RecyclerAdapter.ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerAdapter.ViewHolder holder, int position) {
holder.onBind(mData.get(position));
}
// 사이즈
@Override
public int getItemCount() {
return mData.size();
}
// data 모델의 객체들을 list에 저장
public void setmovieList(ArrayList<Data> list) {
this.mData = list;
notifyDataSetChanged();
}
}
8. MainActivity.java
package com.example.openapi_recyclerview;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
private String key = "자신이 받은 키값을 여기에 설정";
private String address = "https://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json";
private Button btnData;
private RecyclerView recyclerview;
private RecyclerAdapter adapter = new RecyclerAdapter(); // adapter 생성
private ArrayList<Data> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnData = findViewById(R.id.btnData);
recyclerview = findViewById(R.id.recyclerview);
// RecyclerView
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerview.setLayoutManager(linearLayoutManager);
// recyclerview에 adapter 적용
recyclerview.setAdapter(adapter);
// 데이터 불러오기 버튼 클릭
btnData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 오늘 날짜를 20210723 < 이런 형태로 불러온다.
SimpleDateFormat format1 = new SimpleDateFormat("yyyyMMdd");
Date time = new Date();
time.setTime(time.getTime() - (1000*60*60*24)); // 오늘 날짜에서 하루전
String today = format1.format(time);
String urlAddress = address + "?key=" + key + "&targetDt=" + today;
new Thread(){
@Override
public void run() {
try {
URL url = new URL(urlAddress);
InputStream is = url.openStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(isr);
StringBuffer buffer = new StringBuffer();
String line = reader.readLine();
while (line != null) {
buffer.append(line + "\n");
line = reader.readLine();
}
String jsonData = buffer.toString();
// jsonData를 먼저 JSONObject 형태로 바꾼다.
JSONObject obj = new JSONObject(jsonData);
// obj의 "boxOfficeResult"의 JSONObject를 추출
JSONObject boxOfficeResult = (JSONObject)obj.get("boxOfficeResult");
// boxOfficeResult의 JSONObject에서 "dailyBoxOfficeList"의 JSONArray 추출
JSONArray dailyBoxOfficeList = (JSONArray)boxOfficeResult.get("dailyBoxOfficeList");
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
// dailyBoxOfficeList의 length만큼 for문 반복
for (int i = 0; i < dailyBoxOfficeList.length(); i++) {
// dailyBoxOfficeList를 각 JSONObject 형태로 객체를 생성한다.
JSONObject temp = dailyBoxOfficeList.getJSONObject(i);
// list의 json 값들을 넣는다.
list.add(new Data(temp.getString("movieNm"),temp.getString("audiAcc"),temp.getString("openDt")));
}
// adapter에 적용
adapter.setmovieList(list);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
}.start();
}
});
}
}
9. 실행화면
'Android Studio' 카테고리의 다른 글
Android Studio : task 'wrapper' not found in project ':app' 에러 (0) | 2022.05.20 |
---|---|
화면전환 Intent 활용 시 앱 중복 실행방지 (0) | 2022.03.10 |
searchable spinner 만들기 ( 검색가능한 spinner ) (0) | 2021.07.22 |
Android Studio - Open API를 이용하여 Json 파싱하여 ListView에 뿌리기 (4) | 2021.03.17 |
Android Studio - Json Parsing (mssql > json file) (0) | 2021.03.09 |