CustomListView

tpids·2024년 8월 21일

Android

목록 보기
24/29

Ex_CustomListView

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
    }
}

profile
개발자

0개의 댓글