activity_main.xml

msg_list.xml

MsgVO.kt

package com.example.ex_customlistview
// 코틀린에서 제공하는 특별한 형태의 class
// VO를 생성할 수 있도록 도와주는 class
// VO class : getter - 개별값을 가지고 올때 사용하는 메서드(기능) , getName,
// setter - 개별값을 초기화하거나 수정하고 싶을 때 사용하는 메서드, setName,
// toString - 객체가 가지고 있는 값을 문자열로 변환해주는 메서드
// 하나의 메시지 : 이름(String), 메세지 내용(String) -> 속성(Property)
data class MsgVO(var name: String, var msg: String)
MsgAdapter.kt
package com.example.ex_customlistview
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.TextView
// 생성자(객체 생성) 형태 정의
class MsgAdapter(var context: Context, var msgList: ArrayList<MsgVO>) : BaseAdapter() { // BaseAdapter를 상속받겠다!
val inflater : LayoutInflater = LayoutInflater.from(context)
// 아이템리스트 안에 아이템 갯수
override fun getCount(): Int {
return msgList.size
}
// 특정 순서(p0)에 있는 아이템만 반환(돌려주는)
// Any => 어떤 타입이든 상관없다!
override fun getItem(p0: Int): Any {
return msgList[p0]
}
// 특정 순서(p0)에 있는 아이템의 고유 아이디값
override fun getItemId(p0: Int): Long {
return p0.toLong()
}
// msg_list.xml로 정의한 레이아웃에 실제 msgVO가 가지고 있는 이름, 메세지 내용을 적용해서 화면에 보여주는 역할
// 아이템을 리스트뷰에 적용할 때 호출 아이템에 개수만큼 호출
override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
// p0 : 아이템 순서 (ArrayList<MsgVO> => 0,1,2,3, ... )
// p1 : TextView(2개)를 가져올 수 있는 객체
// p2 : 뷰들을 포함하고 있는 부모 컨터이너 객체
// 1. LayoutInflater 생성
// : xml로 작성된 레이아웃을 객체화 시켜주는 역할(textview 2개)
var view:View = inflater.inflate(R.layout.msg_list, p2, false )
val tvName = view.findViewById<TextView>(R.id.tvName)
val tvMsg = view.findViewById<TextView>(R.id.tvMsg)
tvName.text = msgList.get(p0).name // getter 를 자동호출
tvMsg.text = msgList.get(p0).msg
return view
}
}
MainActivity.kt
package com.example.ex_customlistview
import android.os.Bundle
import android.widget.ListView
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 1. item (Array) 준비
var msgList: ArrayList<MsgVO> = ArrayList<MsgVO>()
msgList.add(MsgVO("예진","안녕"))
msgList.add(MsgVO("지영","오랜만이야"))
msgList.add(MsgVO("예진","잘지냈니??"))
msgList.add(MsgVO("지영","주말에 보자!"))
// 2. addapter 준비 (Custom) 준비
val adapter:MsgAdapter = MsgAdapter(applicationContext, msgList)
// 3. 리스트뷰에 어댑터를 적용
val lv:ListView = findViewById<ListView>(R.id.lv)
lv.adapter = adapter
}
}