์๋ฒ์์ Jsonํํ๋ก ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ RecyclerView๋ฅผ ๋ง๋ค์ด๋ณด์์๋๋ฐ,
3์ผ๊ฐ ์ง์ง ๋ฐฅ์ ๋ฅ์ด๊ฑฐ๋ง ํ๋ค๊ณ ํด๋ ๊ณผ์ธ์ด ์๋์ ๋๋ก ๋๋๊ฑฐ๋ฆฌ๋ฉฐ ๋ง๋ค์๋ค.
2๋ ๋ด๋ด ์๋๋ก์ด๋๋ฅผ ์๊ฒ ๋ถ์ก๊ณ ์์๋ ๊ฒ ๋ค๋ผ์ ๋ญ ํ๋ ํ ๋๋ง๋ค ์ค๋ฌด์ค ํ์ง๊ฐ ์๋ค.
์ด์จ๋ ๋๊ฐ์ ์ฌ๋์ด ํ ๋ช ์ด๋ผ๋ ์๋ค๋ฉด ๋์์ด ๋์์ผ๋ฉด ํ๋ ๋ฐ๋์ผ๋ก ์ฌ๊ธฐ์์ ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค.
์ค๊ฐ ์ค๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ธฐ๋ ํ์๋๋ฐ
๊ทธ๋๊ทธ๋ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง๋ index๋ก ์ ๋ฆฌํด์ ๋ค๋ฅธ ํฌ์คํธ์ ๋ฐ๋ก ์ ๋ฆฌํด๋ ๊ฒ์ด๋ค.
์ํผ ์ค๋ฐ๋!
*๊ด๋ จ ๊ฐ๋ ๋ค์ ๊ฐ๋ ํธ์ ์ ๋ฆฌํด๋ฌ์ผ์ง
(๊ฐ๋ ์ ๋ชจํธํ๊ฒ ์๊ณ ์์ผ๋ฉด ์ฝ๊ฒ ๊น๋จน์ผ๋๊น ๋ฌด์์ ๋ฐ๋ผํ๊ณ ๋๋ด๊ธฐ ๋ณด๋จ ๊ฐ๋ ์ ํํํ ํ๋ ๊ฒ๋ ์ค์ํ ๊ฒ ๊ฐ๋ค.)
1. build.grade (Module : app)์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
Gradle Scripts -> build.gradle (Module: app)์ retrofit๊ณผ gson converter์ ์ถ๊ฐํด์ค๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
dependencies {
...
// retrofit
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
// recyclerview
implementation 'androidx.recyclerview:recyclerview:1.1.0'
}
|
RecyclerView์ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ๋์ธ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ RecyclerView๋ ๊ฐ์ด ์ถ๊ฐํด์ค์๋ค.
2. API Client ์์ฑํ๊ธฐ
Retrofit์ ์ด์ฉํ REST API ํต์ ์ ์ํด์๋
1) Retrofit ๊ฐ์ฒด๋ฅผ ์์ฑํด์ฃผ๊ณ 2) REST API ๋ช ์ธ์ ๋ง๋ Interface๋ฅผ ์ ์ธํด์ฃผ์ด์ผ ํฉ๋๋ค.
๋จผ์ , Retrofit ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํ ApiClient.java ํด๋์ค๋ฅผ ๋ง๋ค์ด๋ด ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package com.example.retrofit;
import retrofit2.Retrofit;
public class ApiClient {
private static Retrofit retrofit;
public static Retrofit getClient(){
if(retrofit == null){
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
|
static String ๊ฐ์ผ๋ก BASE_URL์ ์ ์ํด์ฃผ๋ ๋ฐ์, "์๊ธฐ ์์ ๊ฐ์ ธ์ฌ ๋ฐ์ดํฐ๊ฐ ๋ด๊ธด ์๋ฒ ์ฃผ์๋ฅผ ์ฐ์๋ฉด ๋ฉ๋๋ค."
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ ์ฃผ์๊ฐ ๋ฐ๋์ /๋ก ๋๋์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด "http://purple/wood/light"๊น์ง๋ง ์ ๋๋ค๋ฉด
์ค์ ๋ก๋ "http://purple/wood/"๊น์ง๋ง ๊ฐ์ ธ์ค๊ฒ ๋๋ค๋ ์ ์ ์ํด์ฃผ์ธ์.
์ด๋ฆ์ด BASE_URL์ธ ๋งํผ ๋ฒ ์ด์ค ์ฃผ์๋ง ์ ์ด๋์๊ณ ๋๋จธ์ง ์ฃผ์๋ interface์ ์จ์ค ๊ฒ๋๋ค!
*์ ์ฒด ์ฃผ์ : http://ec2-15-164-234-43.ap-northeast-2.compute.amazonaws.com/api/restaurant
๊ฐ๋จํ retrofit ๊ฐ์ฒด ์์ฑ์ ๋ํ ์ค๋ช ์ ์ ์ด๋ณด์๋ฉด,
retrofit -> retrofit ๊ฐ์ฒด๋ฅผ ์ ์ฅํ retrofit ํ์ ์ ๋ณ์
= new Retrofit.Builder() -> retrofit ๊ฐ์ฒด ์์ฑ
.baseUrl(BASE_URL) -> ์ด๋ค ์๋ฒ(BASE_URL)๋ก ๋คํธ์ํฌ ํต์ ์ ํ ๊ฒ์ธ์ง ์ค์
.addConverterFactory(GsonConverterFactory.create()) -> ํต์ ์๋ฃ ํ, ์ด๋ค converter๋ก ๋ฐ์ดํฐ๋ฅผ parsingํ ๊ฒ์ธ์ง
*์์์ gson-converter์ ์ฌ์ฉํ๋ ค๊ณ ๋ฏธ๋ฆฌ gradle์ ์ถ๊ฐํ ๊ฒ์ ๋๋ค!
.build() -> ํต์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํ์ฑํ retrofit ๊ฐ์ฒด ์์ฑ ์๋ฃ-!
์ด๋ ๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
3. Data๋ฅผ ๋ฐ์์ฌ Class ์์ฑํ๊ธฐ
์ ๊ฐ ๊ฐ์ ธ์จ ์๋ฒ์ ์ฃผ์๋ฅผ ๋ค์ด๊ฐ๋ณด๋ฉด ๋ฐ์ดํฐ๊ฐ
{"statusCode":200,"serverTime":1583501031307,"body":[{"id":1,"name":"TEST","locLatitude":123.123456,"locLongitude":123.456789,"numOfStar":0,"numOfLike":0},{"id":2,"name":"๋๋ฒ์งธ ๋ฐ์ดํฐ","locLatitude":111.054869,"locLongitude":120.3154,"numOfStar":0,"numOfLike":0},{"id":3,"name":"ํ์๋ํ๊ต ์์ธ์บ ํผ์ค","locLatitude":37.557394,"locLongitude":127.045354,"numOfStar":1234,"numOfLike":5678},{"id":4,"name":"ํํ์ฟตํธ ๋ง๋ผํ","locLatitude":37.560946,"locLongitude":127.046428,"numOfStar":1000,"numOfLike":2000}]}
์๋ ๊ฒ ์๊ฒผ์ต๋๋ค. ๊ฐ๋จํ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด {"A" : 1, "B" : 2, "C" : [{"a":10, "b":20", "c":30, "d":40}]} ์ด๋ ๊ฒ ์๊ฒผ์ด์!
์ฆ, ์ค๊ดํธ ์ ๋๊ดํธ ์์ ์ค๊ดํธ๊ฐ ๋ ์๋ ํํ์ ๋๋ค.
์ด๋ ๊ฒ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ํํ ์์์ผ ๊ฐ์ ธ์ฌ ๋ ํค๋งค์ง ์์ต๋๋ค.
์ด์ ์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ํด๋์ค๋ฅผ ๋ ๊ฐ ๋ง๋ค๊ฑฐ์์.
TestItem์ ๊ฒ์ ์ผ ์ค๊ดํธ์ ๋ฐ์ดํฐ ํด๋์ค์ด๊ณ Data๋ ์์ ์๋ ์ค๊ดํธ์ ๋ฐ์ดํฐ ํด๋์ค์์.
TestItem์ ๋ณด๋ฉด ์ธ๋ฒ์งธ ๋ณ์๋ก List<Data> body;๊ฐ ์์ฃ .
์ฌ๊ธฐ์ Data๊ฐ ์ค๋ฅธ์ชฝ ํด๋์ค์ด๊ณ , "id, name, locLatitude, locLongitude, numOfStar, numOfLike"๊ฐ ๋ฆฌ์คํธํํ๋ก
TestItem์ body์ ํ๋์ฉ ๋ค์ด๊ฐ์๋ค๊ณ ์๊ฐํ์๋ฉด ์ดํดํ๊ธฐ ํธํฉ๋๋ค.
์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ํ๋ ์ค๋น๋๊ณ , Retrofit ๊ฐ์ฒด๋ ๋ง๋ค์์ผ๋ Interface๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ํต์ ์ ์ํด์์!
+) TestItem ํด๋์ค์๋ toString()๋ฉ์๋๋ ์ ์ํด๋์์ด์! 5๋ฒ ๋จ๊ณ์์ ๋ก๊ทธ๋ฅผ ์ฐ์ ๋ ์ฌ์ฉํ๊ธฐ ์ํจ์ ๋๋ค.
4. API Interface ์์ฑํ๊ธฐ
์ธํฐํ์ด์ค๊ฐ ๋ญ๊ฐ์? ํด๋์ค๊ฐ ๊ตฌํํด์ผํ๋ ๋์์ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ผ์ข ์ ์ถ์ํด๋์ค์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ง๋ค์๋ API Client ์์ฃ ? ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ์๋ฒ ์ฃผ์๋ฅผ ๋ฐ์์ค๊ณ , ๋ฐ์ดํฐ๋ฅผ ํ์ฑํ์ฃ .
๊ทธ๋ฌ๋ฉด ์๋ฒ์์ ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ , ์ด๋ป๊ฒ ๋ฐ์์ง ์ธํฐํ์ด์ค์ ๋ช ์์ ์ฃผ์ด์ผ ํฉ๋๋ค.
1
2
3
4
5
6
7
8
9
|
import retrofit2.Call;
import retrofit2.http.GET;
public interface ApiInterface {
@GET("api/restaurant")
Call<TestItem> getData();
}
|
์ ์ธํฐํ์ด์ค๋ REST API ๋ช ์ธ์ ๋ง๊ฒ ์์ฑํ์ฌ ์ ์ธํ ๊ฒ์ ๋๋ค.
Retrofit์์๋ REST API ํต์ ์ ํ์ํ Annotation์ ๋ง๋ค์ด ๋์์ต๋๋ค.
์์์ ์ ๋ @GET Anotation์ ์ฌ์ฉํ๋๋ฐ์,
์ด ๊ฒฝ์ฐ HTTPํต์ ์ ์ฌ์ฉ๋๋ ๋ฉ์๋ ์ค GET ์์ฒญ์ ํ๊ฒ ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
@GET์ธ์๋ @POST @PUT @DELETE @HEAD ์ด๋ ๊ฒ ์ด 5๊ฐ์ Annotation์ด ์์ต๋๋ค.
Anotation ๊ดํธ ์์๋ ์๊น ์ ์ฒด ์ฃผ์์์ BASE_URL ๋ถ๋ถ์ ๋บ ๋๋จธ์ง ์ฃผ์๋ฅผ ์ ์ด์ฃผ์๋ฉด ๋ฉ๋๋ค.
์ ๋ฆฌํ์๋ฉด, @์ฃผ์(API URL)ํํ๋ฅผ ํตํด์ ์ค์ง์ ์ผ๋ก ์ด๋ค API ์ฃผ์์์ ์ด๋ค ๋ฉ์๋๋ฅผ ์์ฒญํ ๊ฒ์ธ์ง ๋ช ์ํ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ GETํ๊ธฐ ์ํด GET anotation์ ์ด ๊ฒ์ด๊ตฌ์.
์ด์ ์๋ฒ์ ํต์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ GET์์ฒญ์ ํ๊ณ , ์ด์ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค ํํ๋ก ๋ด์๋ ๊ฒ์ธ์ง ๋ช ์ํด์ฃผ์ด์ผ๊ฒ ์ฃ .
์์ ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค ํด๋์ค์ ๋ด์ ๊ฑด์ง ๋ฏธ๋ฆฌ ๋ฐ์ดํฐ ํํ๋ฅผ ๋ณด๊ณ ์ง์ ์ ํด๋์์ผ๋
ํฐ ๊ทธ๋ฆ์ธ TestItem์ ๋ด๊ธฐ๋ก ํฉ์๋ค.
Call<ํํ> getData(); ์ด๋ ๊ฒ ์จ์ฃผ๋ฉด <ํํ>์ ๋ง๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ด์์ getData()๋ฉ์๋๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๋ฉด๋ฉ๋๋ค.
5. MainActivity.class์ ํต์ ํด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ์ ์๋๋ก ์ธํ ํด์ฃผ๊ธฐ
์, ์ด์ ํต์ ์ ์ํ ์ค๋น๋ฅผ ๋ง์ณค์ผ๋ฉด ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ์๋ฆฌ์กฐ๋ฆฌ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ค์ ๋ก Interface์ Retrofit ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ HTTP ํต์ ์ ์์ฒญํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ ๊ฒ์ด์ง์.
์ผ๋จ, MainActivity์ ์ธํ ์ ํ๋ฉด์ TestItem ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์์ค๋ ์ง ํ์ธ์ ํด๋ณด๋ ค๊ณ ํด์.
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
|
public class MainActivity extends AppCompatActivity {
TestItem dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ApiInterface apiInterface = ApiClient.getClient().create(ApiInterface.class);
Call<TestItem> call = apiInterface.getData();
call.enqueue(new Callback<TestItem>() {
@Override
public void onResponse(Call<TestItem> call, Response<TestItem> response) {
dataList = response.body();
Log.d("MainActivity", dataList.toString());
}
@Override
public void onFailure(Call<TestItem> call, Throwable t) {
Log.d("MainActivity", t.toString());
}
});
}
}
|
Line 3 : ์ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ TestItem ํ๋๋ฅผ ๋ง๋ค์ด์ค๋๋ค. ์ ๋ณ์๋ช ์ dataList๋ก ์ง์์ด์.
Line 10 : ์์์ ์ ์ํด๋ Interface๋ฅผ ๋ฐํ์ผ๋ก ์ค์ ๋ก ์ฌ์ฉํ ํด๋ผ์ด์ธํธ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ค๋๋ค.
Line 12 : ํต์ ํ ์๋ต์ ๋ฐ์ Callback์ ๊ตฌํํด์ค๋๋ค. Interface์ ๋ช ์ํ Callํ๊ณ ๊ฐ์ฃ ?
TestItemํํ๋ก ์๋ต์ ๋ฐ์ ์น๊ตฌ๋ฅผ call์ด๋ผ๊ณ ๋ช ๋ช ํด์ฃผ๊ณ apiInterface.getData()๋ก ์๋ต์ ๋ฐ์ต๋๋ค.
Line 14 : Client ๊ฐ์ฒด๊ฐ ์ ๊ณตํ๋ enqueue ํจ์๋ฅผ ํตํด ํต์ ์ ๋ํ ์์ฒญ ๋ฐ ์๋ต์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ช ์ํฉ๋๋ค.
์ฑ๊ณตํ ๊ฒฝ์ฐ์๋ onResponse๋ก ๋ค์ด๊ฐ๊ณ , ์คํจํ ๊ฒฝ์ฐ์๋ onFailure๋ก ๋ค์ด๊ฐ๋๋ค.
๊ฐ๊ฐ์ ๊ฒฝ์ฐ์ Log์ Log.d()๊ดํธ ์์ ๋ด์ฉ์ด ์ถ๋ ฅ๋ ๊ฒ์ ๋๋ค.
Line 19 : dataList์ response.body();๋ฅผ ํตํด Call(์์ฒญ)์ ๋ํ Response(์๋ต)๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํฉ๋๋ค.
Line 20 : Log.d์์ dataList.toString()์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ฒ ๋๊ฒ ์ฃ ?
6. RecyclerView๋ก ๋ฐ์ดํฐ ๋์ฐ๊ธฐ
6-1. RecyclerView ๋ ์ด์์ ๋ง๋ค๊ธฐ
RecyclerView๋ก ๋ฐ์ดํฐ๋ฅผ ๋์ฐ๋ ค๋ฉด RecyclerView๋ฅผ ๋ง๋ค์ด์ฃผ์ด์ผ๊ฒ ์ฃ ?
๋จผ์ ๋ ์ด์์ ๋ ๊ฐ๋ฅผ ๋ง๋ค๊ฒ๋๋ค. Recyclerํ๊ฒ ๋ชฉ๋ก์ ๋์ธ ํ๋ฉด ๋ ์ด์์๊ณผ
๋ชฉ๋ก ํ๋ํ๋, ์ฆ View ํ ํ๋์ ๋ ์ด์์์ ๋ง๋ค๊ฒ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?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/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
|
์ ์ฝ๋๋ ๋ฆฌ์ฌ์ดํด๋ทฐ๊ฐ ์ฌ๋ผ๊ฐ ํ๋ฉด์ ๋๋ค. ๋ ์ด์์ id๋ recyclerView๋ก ์ง์ ํด์ฃผ์์ด์.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?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="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/dataName"
android:layout_width="0dp"
android:layout_weight="4"
android:layout_height="wrap_content"
android:padding="5dp"
android:layout_margin="10dp"
android:textAlignment="center"
android:text="restaurant"/>
</LinearLayout>
|
์ด๊ฑฐ๋ ํ ํ๋์ ๋ ์ด์์์ด์์. android:layout_weight๊ฐ ์๋ ๊ฑธ ๋ณด๋ฉด ๊ฐ์ด ์ค์๋ค์ํผ ์๋ ์ฝ๋๊ฐ ๋๋ฌด ๊ธธ์ด์ ์ค์๋๋ฐ, ์ ๋ 4:1:1๋น์จ๋ก ์ฒซ ์นธ์๋ name, ๋๋ฒ์งธ์นธ์๋ numOfStar, ์ธ๋ฒ์งธ์นธ์๋ numOfLike๋ฅผ ๋ฃ๊ธฐ ์ํด TextView๋ฅผ ๋ฐฐ์นํด์ฃผ์์ต๋๋ค.
6-2. RecyclerView Adapter ๋ง๋ค๊ธฐ
RecyclerView๋ ListView์ ๋ค๋ฅด๊ฒ ํ ํ๋ฉด์ ํ์ํ๊ธฐ ํ๋ ๋ค์์ ๋ฐ์ดํฐ๋ฅผ ์คํฌ๋กค์ด ๊ฐ๋ฅํ list๋ก view๋ฅผ ์ฌํ์ฉํด ํ์ํด์ฃผ๋ ์์ ฏ์ ๋๋ค. ๊ทธ๋์ ๊ทธ ํ์ ์ฌํ์ฉํ๊ธฐ ์ํด Adapter๋ก itemView๋ฅผ ๋ง๋ค์ด๋ด์ ์ฌ์ฉํ์ฃ .
์๋์ ๋ณด์ฌ๋๋ฆฌ๋ ์ฝ๋๋ฅผ ํ๋์ฉ ๋ฏ์ด์ ์์ธํ ์ญํ ์ค๋ช ์ ํ๋ ๊ฒ์ RecyclerView ์ ์ฉ ํฌ์คํธ์์ ์ค๋ช ํ๋๋ก ํ๊ธฐ๋ก ํ๊ณ ์ฐ์ ์ ์๊ธฐ์ ์ง์ค์ ํด๋ด ์๋ค.
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
|
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder>{
private Context c;
private List<Data> dataList;
public RecyclerAdapter(Context c, List<Data> dataList) {
this.c = c;
this.dataList = dataList;
}
@NonNull
@Override
public RecyclerAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerAdapter.MyViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return dataList.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView name;
TextView numOfStar;
TextView numOfLike;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
name = (TextView)itemView.findViewById(R.id.dataName);
numOfStar = (TextView)itemView.findViewById(R.id.dataNumOfStar);
numOfLike = (TextView)itemView.findViewById(R.id.dataNumOfLike);
}
}
}
|
์ ๋ ์ ๋ฐ์ดํฐ์์ id, locLatitude, locLongitude๋ฅผ ๋นผ๊ณ name์ด๋ numOfStar, numOfLike๋ง ๋ฐ์์ ๋์ฐ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ Adapter๋ฅผ ๋ง๋ค๋ ์์ itemView์ ์ด ์ธ ๊ฐ์ง๋ง ๋ฃ์ด์ฃผ์์ต๋๋ค.
RecyclerView๋ฅผ ์ํ Adapter๋ ์ด๋ฐ ํํ์ธ๋ฐ ์ฒ์์ RecyclerView๋ฅผ ๋ง๋ค ๋ Holder ํด๋์ค๋ฅผ ๋ฐ๋ก ๋ง๋ค์์๋๋ฐ ๊ฐ์ด ๋ง๋๋ ๊ฒ ๋ ํธํ ๊ฒ ๊ฐ์ต๋๋ค. Holder๋ ๋ ์ด์์๊ณผ ์ฐ๊ฒฐํด์ itemView๋ฅผ ๋ง๋ค์ด์ฃผ๋ ์ญํ ์ ํด์. (๋จ์ ์ฐ๊ฒฐ)
Adapter์์๋ Holder์์ ๋ง๋ค์ด์ค itemView๋ฅผ inflater์ ์ด์ฉํด ๊ฐ์ฒดํ ์ํค๊ณ , ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ด์์ค๋๋ค.
๋ค์ ๋งํด, Holder๋ก itemView๊ทธ๋ฆ์ ๋ง๋ค๋ฉด Adapter๊ฐ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ itemView๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฑฐ์ฃ !
๊ทธ ๊ณผ์ ์์ inflater๋ xml์ ๊ฐ์ฒดํ์ํค๋ ๊ฑธ ๋๊ณ , layoutManager์ recyclerview์ ์ฐจ๋ก์ฐจ๋ก ๋์ฐ๋ ๊ฑธ ๋์์ค๋๋ค.
6-3. RecyclerView ์ฌ์ฉํ๊ธฐ
์ด์ RecyclerView๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๋ง๋ฐ์ ์ค๋น๋ฅผ ๋๋์ผ๋, MainActivity๋ก ๋์๊ฐ์ ์ฐ๋ฉด ๋ฉ๋๋ค!
1
2
3
4
5
6
7
|
public class MainActivity extends AppCompatActivity {
TestItem dataList;
List<Data> dataInfo;
RecyclerView recyclerView;
RecyclerAdapter recyclerAdapter;
|
์ฐ์ MainAcitivity ์์ ์ด๋ ๊ฒ RecyclerView์ Adapter ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
์! List<Data> dataInfo;๊ฐ ์ถ๊ฐ๋ ๊ฒ ๋ณด์ด์๋์? ๊ธฐ์กด์ TestItem dataList; ์๋์์!
์ ๋ ์ด๊ฑฐ ํ ๋ ์ค๊ดํธ ์ ์ค๊ดํธ ์์ ์๋ ๋ฐ์ดํฐ๋ค ์ค ๋ช ๊ฐ๋ฅผ ๊ณจ๋ผ์ ์ฌ์ฉํ๊ณ ์ถ์๋ฐ,
์ด๊ฑธ ์ด๋ป๊ฒ ํด์ผํ๋ ํ๋ฉด์ ์ ๋ง ํค๋งธ์์ด์.
๊ธฐ์ด๊ฐ ๋ถ์กฑํ ํ์ธ์ง, ๊ธฐ์ด์ ์ธ ๊ฑธ ์ฌ์ฉํ๋ ๊ฒ ์ต์ํ์ง ์์ ํ์ธ์ง ๋ง์ด ํค๋งธ์๋๋ฐ
์ด์จ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ๋ ๊ณต์ ํด๋ณด๊ณ ์ ํฉ๋๋ค.
์ค๊ดํธ ์ ์ค๊ดํธ ๋ด์ฉ๋ค์ ๋ด์ ํด๋์ค๋ฅผ Data.class๋ก ๋ง๋ค์ด์คฌ์์ฃ ? ๊ทธ๊ฑธ ๋ฆฌ์คํธ๋ก ๊ฐ์ ธ์ค๊ธฐ ์ํด
์ ๋ ๊ฒ dataInfo๋ผ๋ ์ด๋ฆ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์คฌ์ด์!
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
|
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dataInfo = new ArrayList<>();
recyclerView = findViewById(R.id.recyclerView);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
ApiInterface apiInterface = ApiClient.getClient().create(ApiInterface.class);
Call<TestItem> call = apiInterface.getData();
call.enqueue(new Callback<TestItem>() {
@Override
public void onResponse(Call<TestItem> call, Response<TestItem> response) {
dataList = response.body();
Log.d("MainActivity", dataList.toString());
dataInfo = dataList.body;
recyclerAdapter = new RecyclerAdapter(getApplicationContext(), dataInfo);
recyclerView.setAdapter(recyclerAdapter);
}
|
onCreate์์์ ๋ณธ๊ฒฉ์ ์ผ๋ก RecyclerView์ ๋์ธ ์ค๋น๋ฅผ ํ ๊ฑฐ์์.
Line 6 : dataInfo๋ผ๋ ๋ณ์๋ก ์๋ก์ด ArrayList<>๋ฅผ ์ ์ํด์ค๋๋ค.
Line 9&10 : ๊ทธ๋ฆฌ๊ณ ์์ ์ค๋ช ๋๋ฆฐ LayoutManager์ ์ด์ฉํ์ฌ RecyclerView๋ฅผ ์ธํ ํด์ค๋๋ค.
Line 24 : Call(์์ฒญ)์ ๋ํ Response(์๋ต)๋ฅผ dataList๋ผ๋ TestItemํํ์ ๊ฐ์ฒด์ ๋ด์์์์?
๊ทธ๋ฌ๋ฉด ๊ทธ dataList์ ๋ด๊ธด body part, ์ฆ List<Data>๋ฅผ ๋ฝ์์ค๊ธฐ ์ํด dataInfo = dataList.body;๋ฅผ ํด์ค๋๋ค.
*์ฌ๊ธฐ์ response.body()์์์ body()ํจ์์ body๋ฅผ ํท๊ฐ๋ฆฌ๋ฉด ์๋์!
ํ์์ body๋ ์ ๊ฐ ๋ฐ์์ค๋ ๋ฐ์ดํฐ ๋ด์์์ ๋ณ์๋ช ์ ๋๋ค!! ใ ใ ใ
Line 26 : ์ด์ Adapter๋ฅผ ์ด์ฉํด์ dataInfo์ ์๋ ๋ด์ฉ์ ๊ฐ์ ธ์์ ์ง์ ํด๋ itemView ํ์์ ๋ง๊ฒ ๋์ฐ๊ฒ ๋ ๊ฒ๋๋ค!
์จ์ง !!
์์์ ๋ดค๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ณด์ฌ๋๋ฆฌ์๋ฉด
{"statusCode":200,"serverTime":1583501031307,"body":[{"id":1,"name":"TEST","locLatitude":123.123456,"locLongitude":123.456789,"numOfStar":0,"numOfLike":0},{"id":2,"name":"๋๋ฒ์งธ ๋ฐ์ดํฐ","locLatitude":111.054869,"locLongitude":120.3154,"numOfStar":0,"numOfLike":0},{"id":3,"name":"ํ์๋ํ๊ต ์์ธ์บ ํผ์ค","locLatitude":37.557394,"locLongitude":127.045354,"numOfStar":1234,"numOfLike":5678},{"id":4,"name":"ํํ์ฟตํธ ๋ง๋ผํ","locLatitude":37.560946,"locLongitude":127.046428,"numOfStar":1000,"numOfLike":2000}]}
์ด๋ ๊ฒ ์๊ฒจ๋จน์ ๋ฐ์ดํฐ์์ฃ ? ์ฌ๊ธฐ์ name, numOfStar, numOfLike๋ถ๋ถ๋ง ๊ฐ์ ธ์จ ๊ฑฐ์์!
์ฉ์ด๋ณด๊ฐ ํ๊ธฐ์ 3์ผ ๊ฐ ์ด๋ ค์์ด ๋ง์์ง๋ง ์์ฑํ๊ณ ๋๋ ๋ฟ๋ฏํ์์ด์.
์ฐ์ฐํ ๋ธ๋ก๊ทธ๋ฅผ ๋ฐ๊ฒฌํ ๋๊ตฐ๊ฐ๊ฐ ์์ ๋์์ด๋๋ง ๋์์ผ๋ฉด ์ข๊ฒ ๋ค์.
์ด์ฉ๋ค๋ณด๋ ๊ตฌ์ด์ฒด๊ฐ ๋์๋๋ฐ, ์จ๋ ๋!!
'๐ป Computer > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋๋ก์ด๋ ์คํ๋์ค Github Push Partially failed (0) | 2020.10.04 |
---|---|
Android ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๊ธฐ (1) | 2020.08.07 |
RecyclerView Click Event ์ฒ๋ฆฌ ๋ฐฉ๋ฒ 2๊ฐ์ง (0) | 2020.07.25 |
Type androidx.activity.R is defined multiple times (0) | 2020.07.23 |
Intent์์ Context (0) | 2020.07.23 |