Android Studio

open Api를 이용하여 json 데이터를 recyclerview에 뿌리기

J_Bin 2021. 7. 23. 13:32

 

 

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. 실행화면