코린이 탈출기

chapter 6.3 - 리스트뷰 만들기 (2) - Adapter 클래스 뼈대 작업 본문

인터넷 강의/클래스101 - 비전공자들을 위한 나만의 안드로이드 앱 만들기

chapter 6.3 - 리스트뷰 만들기 (2) - Adapter 클래스 뼈대 작업

50HEE 2021. 5. 10. 20:46

이전에는 어떤 데이터를 뿌려줄지에 대한 데이터 클래스와 어떤 모양으로 보여줄지를 만들었습니다.

재료를 준비했다고 생각하시면 됩니다.

 

2021.05.08 - [안드로이드/클래스101 - 비전공자들을 위한 나만의 안드로이드 앱 만들기] - chapter 6.2 - 리스트뷰 만들기 (1) - 기초 재료 만들기

 

이제는 위에서 만든 재료들을 엮어주는 과정인 Adapter을 사용해보겠습니다.

Adapter 클래스는 데이터 클래스와 xml을 조합해서 리스트뷰에 뿌려주는 역할을 합니다.

이번 챕터에서는 기초 뼈대 작업만 우선 진행하겠습니다. 

실제 데이터를 반영하는 작업은 가장 마지막에 다룰 예정입니다.

 

 

 

패키지 새로 만들기

정리를 하기 위해 어댑터들을 adapters 패키지에 따로 관리합니다. 

만들어진 패키지가 따로 없기 때문에 새로 만들겠습니다.

이전에 했던 데이터 패키지를 만드는 방법과 동일합니다.

 

위의 그림처럼 클릭을 하면 아래의 박스가 생성됩니다.

패키지의 이름은 처음 액티비티를 새로 만들 때 작성했던 이름이 자동으로 작성되고, '.' 뒤에 원하는 패키지 명을 설정합니다.

패키지 이름 설정

 

 

 

코틀린 클래스 만들어 주기

패키지를 만들면 안에 어댑터 클래스를 만들어줍니다.

 

클래스 이름 설정

클래스의 이름은 보통 첫글자를 대문자로 작성해줍니다.

 

 

 

지금까지 만든 것들을 엮어주고 자리에 맞게 뿌려주는 역할을 하나하나 직접 코딩을 하면 해야 할 것이 너무 많고 오래 걸리고 복잡합니다.

그래서 상속이라는 것을 이용하여 좀 더 쉽게 코딩을 해보겠습니다.

 

 

 

상속을 받는 역할을 해주는 클래스의 이름이 ArrayAdapter이라고 합니다.

ArrayAdapter은 어떤 종류의 데이터를 목록으로 받아서 화면에 뿌려줄 것인지를 <>안에 작성해주어야 합니다.

만약 여기까지 작성하였다면 에러가 사라지지 않을 것입니다.

그 이유는 코틀린에서는 상속이라는 것을 받을 때 어떤 생성자를 기반으로 받을 것인가를 골라주어야 합니다.

아마 무슨 말인지 이해하기 어려울 수 있습니다.

cahpter7을 통해 상속에 대해 더 자세하게 다룰 예정입니다.

우선 이해가 안 가더라도 한번 해보시기를 권합니다.

여기서 생성자는 ( )라고 생각하시면 됩니다.

 

<코드 정리>

class 클래스 명 : ArrayAdapter<뿌려줄 데이터 클래스>( )

 

 

ArrayAdapter

아마 위의 설명대로 따라하더라도 위와 같이 에러는 아직 사라지지 않습니다.

어댑터는 기본적인 모양을 지원하지 않기 때문입니다.

여기서 기본적인 모양은 ( ) 안에 내용을 담지 않은 것을 의미합니다. 

그리하여 안에 재료를 넣어주어야 하는데 아무거나 집어넣을 경우에는 당연히 불가능합니다.

원하는 재료를 넣어 넘겨주어야 하기 때문에 클래스의 생성자를 작성하겠습니다.

즉, 어댑터의 주 생성자에서 필요한 재료를 받아야하기 때문에 주 생성자를 작성하겠습니다.

 

 

 

데이터 클래스인 'Student.kt'에서 작성한 것과 같습니다.

생성자 작성

위처럼 주 생성자 안에는 3개의 변수를 정하였습니다. 

14번 줄 처럼 ArrayList 같은 경우에는 무엇을 담고 있는 것인지를 <>안에 담아주어야 합니다. ArrayAdapter과 같은 개념입니다.

ArrayAdapter를 부모라고 보시고, 부모의 넣어줄 재료로 활용하기 위해 주 생성자 안에 3개의 변수를 설정한 것입니다.

StudentAdapter가 ArrayAdapter 로서의 역할을 물려받아서 할 수 있는 기초공사의 일부가 완료되었습니다.

이제 줄괄호{ } 안에는 xml을 만든 것을 끌어와서 코틀린에서 사용하도록 코드를 작성하겠습니다.

 

<코드 정리>

class 어댑터 클래스 명 (필요한 재료) : ArrayAdapter <뿌려줄 데이터 클래스> (필요한 재료) { } 

다르게 표현하면

class 어댑터 클래스 명 (val mContext: Context, val resId: Int, val mList: ArrayList <뿌려줄 데이터 클래스>) : ArrayAdapter <뿌려줄 데이터 클래스> (mContext, resId, mList) { } 

 

 

 

xml을 가지고 객체로 변환해주는 변수 즉, 화면에 뿌리도록 도와주는 어댑터 변수를 멤버 변수(클래스 내부의 변수)로 생성하겠습니다.

이 화면을 기반으로 inflater을 만들어 준다는 의미입니다.

간단하게 말하면 inflater란 한 칸을 의미합니다. 뒤에서 더 자세하게 다루겠습니다. 16번 줄과 같습니다.

val 변수 명: LayoutInflater.from(mContext)

 

우리가 만든 xml 모양으로 뿌려주기 위해 getView라는 함수를 오버라이딩하여 이용하겠습니다.

오버라이딩에 대해 잘 모르시면 자동완성하는 것이라고 생각하시면 됩니다.

getView

getView 함수를 오버라이딩을 하면 위와 같이 작성됩니다. 밑의 줄은 사용하지 않기 때문에 지우겠습니다.

getView 함수를 실행할 때 convertView를 검사할 것인데 임시로 쓰는 한 칸이라는 뜻으로 변수를 저장하겠습니다. 22번 줄과 같습니다.

if문으로 질문을 하겠습니다. 24번 줄과 같습니다. 24번 줄은 tempRow의 내용물이 없는 것인지를 확인하는 코드입니다.

만약 내용물이 없다면 inf의 기능을 불러오도록 하겠습니다.

( ) 안에는 한 칸에 해당하는 xml 모양을 불러주라는 코드를 작성하겠습니다.

root는 부가적으로 적어줄 내용을 의미하는데, 따로 없기 때문에 null로 작성하였습니다. 26번 줄과 같습니다.

여기까지 작성을 하면 내용이 없을 경우는 없습니다. 24~26번 줄을 통해 내용이 없을 경우를 대비하였기 때문입니다.

이제 진짜로 뿌려질 한 칸을 만들어 주겠습니다. 30번 줄과 같습니다. 30번 줄은 tempRow가 절대로 null이 될 수 없다는 것을 뜻합니다. !!는 코틀린 문법을 통해 다시 다루도록 하겠습니다.

마지막으로 리스트뷰에 row를 뿌려달라는 뜻으로 getView 함수의 결과로 return 구문을 작성해줍니다.  32번 줄과 같습니다.

 

 

 

여기까지 작성을 하고 에뮬레이터를 실행을 하면 아무것도 나오지 않을 것입니다.

어댑터를 만들었지만 실제 사용하지는 않았기 때문입니다. 

 

 

 

이번에는 상속이라는 개념과 코틀린 문법을 다루었습니다.

ListView에 초점을 맞추어 설명이 부족하지만 chapter7을 통해 자세하게 설명을 할 것입니다.

Comments