2020/03/19 - [안드로이드/개발자 일상] - 안드로이드 Gson 라이브러리 (JSON 파일을 만들어서 Gson 이용)
만약 Gson의 이해가 부족하신 분은 위 예제를 먼저 하시면 좋을 것 같습니다.
이번 예제는 위 예제와 데이터는 거의 비슷하고 RecyclerView를 추가로 이용한 것입니다.
Gson 라이브러리 추가 및 이용 방법은 위 예제를 참고 바랍니다. 여기에서는 간단하게 설명하겠습니다.
(위 예제는 Json을 Java 객체로만 바꿈.)
<실행 화면> Json 파일을 Gson을 이용해 Java객체로 변환했습니다. 그 데이터를 RecyclerView로 보여줍니다.
우선 Gson 라이브러리를 추가합니다.
Gradle:
dependencies {
implementation 'com.google.code.gson:gson:2.8.6'
}
assets폴더를 만들고, jsonData.json 파일을 만들어 줍니다.
jsonData.json
(영화진흥위원회 오픈 API 일별 박스오스피) 응답 예시 Json 내용
만든 jsonData.json에 아래 내용을 복붙합니다.
1
|
{"boxOfficeResult":{"boxofficeType":"일별 박스오피스","showRange":"20200319~20200319","dailyBoxOfficeList":[{"rnum":"1","rank":"1","rankInten":"0","rankOldAndNew":"OLD","movieCd":"20199842","movieNm":"인비저블맨","openDt":"2020-02-26","salesAmt":"58340180","salesShare":"20.4","salesInten":"-10174200","salesChange":"-14.8","salesAcc":"3936045540","audiCnt":"6953","audiInten":"-1281","audiChange":"-15.6","audiAcc":"451518","scrnCnt":"517","showCnt":"1287"},{"rnum":"2","rank":"2","rankInten":"1","rankOldAndNew":"OLD","movieCd":"20192399","movieNm":"1917","openDt":"2020-02-19","salesAmt":"52782440","salesShare":"18.5","salesInten":"7328740","salesChange":"16.1","salesAcc":"5804015500","audiCnt":"6078","audiInten":"583","audiChange":"10.6","audiAcc":"632433","scrnCnt":"460","showCnt":"1030"},{"rnum":"3","rank":"3","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20204791","movieNm":"다크 워터스 ","openDt":"2020-03-11","salesAmt":"34389960","salesShare":"12.1","salesInten":"-12282380","salesChange":"-26.3","salesAcc":"716521920","audiCnt":"4156","audiInten":"-1624","audiChange":"-28.1","audiAcc":"82671","scrnCnt":"460","showCnt":"1019"},{"rnum":"4","rank":"4","rankInten":"62","rankOldAndNew":"OLD","movieCd":"20205096","movieNm":"세인트 아가타 ","openDt":"2020-03-19","salesAmt":"24458940","salesShare":"8.6","salesInten":"24380960","salesChange":"31265.7","salesAcc":"25768920","audiCnt":"2903","audiInten":"2892","audiChange":"26290.9","audiAcc":"3068","scrnCnt":"390","showCnt":"744"},{"rnum":"5","rank":"5","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20193321","movieNm":"정직한 후보","openDt":"2020-02-12","salesAmt":"11783460","salesShare":"4.1","salesInten":"-6137160","salesChange":"-34.2","salesAcc":"12674591150","audiCnt":"2088","audiInten":"-868","audiChange":"-29.4","audiAcc":"1509982","scrnCnt":"257","showCnt":"409"},{"rnum":"6","rank":"6","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20180962","movieNm":"지푸라기라도 잡고 싶은 짐승들","openDt":"2020-02-19","salesAmt":"11868580","salesShare":"4.2","salesInten":"-4470720","salesChange":"-27.4","salesAcc":"5250369610","audiCnt":"1407","audiInten":"-551","audiChange":"-28.1","audiAcc":"605037","scrnCnt":"260","showCnt":"423"},{"rnum":"7","rank":"7","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20192240","movieNm":"작은 아씨들","openDt":"2020-02-12","salesAmt":"10796680","salesShare":"3.8","salesInten":"-4323960","salesChange":"-28.6","salesAcc":"7094634750","audiCnt":"1342","audiInten":"-522","audiChange":"-28","audiAcc":"841564","scrnCnt":"211","showCnt":"309"},{"rnum":"8","rank":"8","rankInten":"-1","rankOldAndNew":"OLD","movieCd":"20180523","movieNm":"스타 이즈 본","openDt":"2018-10-09","salesAmt":"6574440","salesShare":"2.3","salesInten":"-2086100","salesChange":"-24.1","salesAcc":"4370019080","audiCnt":"1293","audiInten":"-433","audiChange":"-25.1","audiAcc":"512921","scrnCnt":"185","showCnt":"265"},{"rnum":"9","rank":"9","rankInten":"11","rankOldAndNew":"OLD","movieCd":"20204340","movieNm":"시원찮은 그녀를 위한 육성방법 피날레","openDt":"2020-02-27","salesAmt":"7310640","salesShare":"2.6","salesInten":"4546500","salesChange":"164.5","salesAcc":"114888460","audiCnt":"960","audiInten":"612","audiChange":"175.9","audiAcc":"13456","scrnCnt":"45","showCnt":"60"},{"rnum":"10","rank":"10","rankInten":"0","rankOldAndNew":"NEW","movieCd":"20167542","movieNm":"분노의 질주: 더 익스트림","openDt":"2017-04-12","salesAmt":"8411000","salesShare":"2.9","salesInten":"8411000","salesChange":"100","salesAcc":"29989567348","audiCnt":"842","audiInten":"842","audiChange":"100","audiAcc":"3654080","scrnCnt":"34","showCnt":"120"}]}}
|
나중에는 Key를 발급 받아서 사용해봅시다.
안드로이드 개발자 사이트 리사이클러뷰 사용 방법 링크 참고
https://developer.android.com/guide/topics/ui/layout/recyclerview
Gradle:
dependencies {
implementation 'com.android.support:recyclerview-v7:28.0.0'
}
activity_main.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
android:id="@+id/rv_recyclerview"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="RecyclerView show"
android:onClick="click_btn"
app:layout_constraintBottom_toBottomOf="parent"
tools:layout_editor_absoluteX="111dp" />
|
그리고 데이터를 표현할 xml을 작성합니다.
(json에 정보가 많지만 "rank", "movieNm", "openDt" 3가지만 보여줄 겁니다.
저 이름은 Json file을 보고 작성한 것입니다.)
recyclerview_item.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="100dp"
<TextView
android:id="@+id/tv_rank"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@color/colorPrimary"
android:textSize="24sp"
android:textColor="#FFFFFF"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.12"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.506"/>
<TextView
android:id="@+id/tv_movieNm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.352"
app:layout_constraintStart_toEndOf="@+id/tv_rank"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.506"
tools:text="movieName" />
<TextView
android:id="@+id/tv_openDt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:text="2020-01-01" />
|
이제 어댑터를 만들겠습니다.
MyAdapter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
package com.daonn.ex_gson_recyclerview;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.Map;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private ArrayList<Map<String, Object>> items= new ArrayList<Map<String, Object>>();
public MyAdapter(ArrayList<Map<String, Object>> resultList){
this.items=resultList;
}
@NonNull
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item , parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.setItem(item);
}
@Override
public int getItemCount() {
return items.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
public TextView tvRank, tvMovieNm, tvOpenDt;
public MyViewHolder(View itemView) {
super(itemView);
tvRank=itemView.findViewById(R.id.tv_rank);
tvMovieNm=itemView.findViewById(R.id.tv_movieNm);
tvOpenDt=itemView.findViewById(R.id.tv_openDt);
}
public void setItem(Map<String, Object> item){
//"rank", "movieNm", "openDt"은 Json파일에 저장되어 있던 key값
}
}
}
|
이제 MainActivity.java를 작성합니다.
우선 Json 데이터를 Java객체로 변경합니다. (Gson 라이브러리 이용)
그리고 버튼을 누렀을 시 recyclerview에 setAdapter해줍니다.
MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
package com.daonn.ex_gson_recyclerview;
import android.os.Bundle;
import android.view.View;
import com.google.gson.Gson;
import org.json.JSONObject;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerView.Adapter mAdapter;
Gson gson = new Gson();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView=findViewById(R.id.rv_recyclerview);
try{
InputStream is = getAssets().open("jsonData.json");
byte[] buffer = new byte[is.available()];
String json = new String(buffer, "UTF-8");
JSONObject jsonObject = new JSONObject(json);
Map<String,Object> boxOfficeResult= gson.fromJson( jsonObject.get("boxOfficeResult").toString(),new TypeToken<Map<String, Object>>(){}.getType());
mAdapter=new MyAdapter(jsonList);
}catch (Exception e){e.printStackTrace();}
}//onCreate()..
public void click_btn(View view) {
recyclerView.setAdapter(mAdapter);
}
}
|
<실행 화면> Json 파일을 저장하여 Gson을 이용해 Java객체로 변환했습니다. 그 데이터를 RecyclerView로 보여줍니다.
<응용편 - Retrofit2를 이용하여 RecyclerView로 보여주는 예제 (영화진흥위원회 오픈 API) >
Retrofit통신을 통해서 영화 정보를 가져와서 보여주는 예제를 작성하겠습니다.
2020/03/22 - [안드로이드/개발자 일상] - 안드로이드 Retrofit2+RecyclerView (영화진흥위원회 오픈 API 이용)
'안드로이드 > 개발자 일상' 카테고리의 다른 글
안드로이드 Retrofit2+RecyclerView 1-1(영화진흥위원회 오픈 API 이용) (6) | 2020.03.22 |
---|---|
안드로이드 JSONObject를 List, Map으로 저장하는 팁 (14) | 2020.03.21 |
안드로이드 Gson 라이브러리 (JSON 파일을 만들어서 Gson 이용) (0) | 2020.03.19 |
안드로이드 앱 권한 요청 라이브러리 AutoPermissions (2) | 2020.03.17 |
안드로이드 다른 모양 버튼(custom button) 만들기 (0) | 2020.03.15 |
댓글