인프런) 앱 8개를 만들면서 배우는 안드로이드 코틀린

섹션 4. 명언 앱 만들기(1)-리스트뷰 활용법 etc

농농씨 2023. 8. 29. 22:46

-폰트 삽입하는 법

폰트 이름 대문자면 안드로이드 스튜디오에서 인식 못함. 영어를 소문자로 바꿔주기

그 다음 안드로이드 스튜디오에서 프로젝트 열고 res 디렉토리 우클릭해서 New->Directory 클릭해주기

font라는 이름의 디렉토리 생성하고 다운받은 폰트를 복붙하기 또는 넣어주기

 

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:fontFamily="@font/bmjua_ttf" // 배민주아체를 예시로 사용
>

 

-코틀린의 '리스트'

리스트란? 값들의 나열

// 코틀린 리스트 예시
var testList = mutableListOf<String>() // 빈 리스트 생성, 문자열(String)을 집어넣을 것임.
testList.add("a") // 리스트에 값 넣기
testList.add("b")
testList.add("c")

// 리스트에 데이터 잘 들어갔는지 로그로 확인하기
Log.d("MainActivity", testList) // 그냥 testList 넣으면 문자열 아니라서 오류 뜸
Log.d("MainActivity", testList.toString()) // toString() 붙여서 문자열로 바꿔줘야 함
>>로그 결과값
[a, b, c]

// 각각의 데이터 확인
Log.d("MainActivity", testList[0]) // 리스트의 데이터는 그 자체로 문자열이라서 toString() 변환 안해줘도 되는듯
Log.d("MainActivity", testList[1])
>>로그 결과값
a
b

 

   

MainActivity에서 데이터를 '리스트'형태로 Adapter에 보내면 Adapter가 데이터를 하나하나 listView에 넣어준다.

 

activity_main.xml 파일(만들어져있거나 만들거나)에 <ListView> 만들어주고

어댑터 만들러 가봅시다.

 

.kt로 끝나는 소스코드 파일들 있는 디렉터리 우클릭해서 New->Kotlin Class/File 클릭하고 'ListViewAdapter'라는 이름의 파일 만들어주기

어댑터를 만들려면? 먼저 어댑터가 '데이터를 받아야 한다'

빨간불 뜨는거 alt+enter 해서 'emplement members' 클릭하고 넣으란거 다 넣어주기

 

 

(분명 강의는 API 16이고 이건 API 23? 인데 왜 list[position] 적용이 안될까... 일단 하란대로 다 하고 마지막에 프로젝트만 새로 만들어서 실행해보자)

 

아이템을 넣을 리스트뷰의 'xml 파일'을 만들러 가보자~

layout 디렉터리 우클릭->New->Layout Resource File 누르고 listview_item 으로 이름짓고 파일 만들기

이렇게 작성해서 텍스트뷰 만들어주고 이 아이템을 어댑터로 연결해주자~

빨간글씨 난리

이제 메인에서 리스트의 아이템을 어댑터에 넣어주자.

 

순서복습)

메인액티비티에서 리스트 데이터를 어댑터에 전달하고,

어댑터는 리스트의 데이터 하나하나를 listview_item.xml라는 리스트뷰를 나타내는 레이아웃에 전달한다.

그리고 메인 액티비티의 레이아웃에서 그 리스트뷰를 출력한다.

복습 끝)

 

리스트 데이터를 어댑터에 넘겨주려고 하는 중이었음

구조도 참고) 이제 어댑터-리스트뷰레이아웃 연결, 메인액티비티-어댑터 연결이 차례로 끝났으니

리스트뷰레이아웃-메인액티비티레이아웃을 연결할 차례이다.

 

내가 만든 어댑터의 이름을 adapter->listAdapter로 바꿔줬음(리스트뷰(listview)의 자체 어댑터와 이름 구분짓기 위해)

 

<강의에서 나온 실행시 화면

근데 왜 개수는 리스트의 아이템 개수와 같은데 리스트 데이터가 아닌

리스트뷰에 넣었던 텍스트만 나오는 걸까! 해결해보자~

강의화면

오른쪽에 띄워진 MainActivity에서 리스트에 아이템 넣고 ("A", "B", "C") listAdapter라는 이름의 어댑터 만들어서 리스트데이터를 전달함.

그리고 왼쪽 화면의 ListViewAdapter가 List를 속성으로 받고 있는 걸 볼 수 있음.

이제 그 어댑터가 A, B, C의 값을 각각의 리스트뷰의 아이템에 넣어줄 차례.

어댑터 파일로 가서 findViewById로 뷰 객체 찾아서 변수에 저장한 다음. .text라는 속성 이용해서 그 뷰의 텍스트뷰에, List[position] 즉, 리스트의 각각의 아이템을 연결해주도록 함

 

강의의 실행화면

리스트의 데이터가 리스트뷰의 각각의 아이템으로 잘 들어간 것을 확인할 수 있다.

 

이때, 문자열 데이터가 아닌 데이터 모델을 전달해줄 수도 있다.

 

아까 어댑터 소스파일 만들어줄 때와 똑같이 소스있는 디렉터리 우클릭->New->Kotlin Calss/File 클릭해서 'ListViewModel'이라는 파일 만들어주기

데이터모델 만들어줬음

 

이런 식으로 데이터 타입을 바꿔서 전달해볼 것이다.

 

먼저, 메인액티비티로~

리스트 생성부터 데이터 삽입까지 데이터 모델에 맞게 바꿔줌

 

그런데

만들어준 어댑터가 리스트를 받는 것에 오류가 생긴다.

어댑터도 수정을 해줘야 한다!

어댑터로~

 

List를 ListViewModel 로 수정해주고

List[position] 외에 .(데이터 모델의 속성명)을 따로 붙여줘야 한다.

(아까 데이터 모델 만들 때

첫번째 데이터는 title, 두번째 데이터는 content라고 이름붙였으므로)

.title 하면

이렇게 나오고

.content로 content를 가져오겠다고 하면

 이렇게 뜬다.

 

 

 

 title과 content를 둘다 넣고싶다면 텍스트뷰를 두개 만들면 된다.

 

텍스트뷰 먼저 만들어주고~

두번째 텍스트뷰에 content 부분을 넣어줄 예정.

 

어댑터로 가서~

아까 title 넣을때처럼

'findViewById로 뷰 객체 생성하고

뷰의 텍스트뷰를 리스트의 [position]으로 연결해주는' 과정 똑같이 해주면 됨

 

강의 실행화면