0. 모델 객체와 커스텀 어뎁터 이들 두 가지를 만들 것이다.
1. 먼저 모델 객체를 만들어야 한다.
모델 객체 : 한 리스트에 출력해줄 데이터들을 어떤 것들을 선언을 할거냐
먼저 Activity 폴더에서
우클릭 -> New -> Kotlin ClassFile 을 클릭해준다.
모델 객체를 사용하는 이유는 이전에는 단순히 문자열이 담긴 리스트를 가져다가 문자열을 하나씩 출력해 준 것에 나해 이제는 사진도 넣고 다양한 view들을 원하는 대로 담아주기 위해서 그렇다.
package com.example.myapplication
// 클래스 모델 객체.
class User (val time : String, val task : String, val lock : String, val alarm : Int)
리스트뷰가 한개가 들어갈때 어떤 디자인을 해줄거냐를 하는 것이기에 전체 레이아웃도 좁게 해주어야 함.
이제 커스텀 어뎁터를 만들어야 한다.
ArraryAdapter 같은게 어뎁터의 종류이자 기본적으로 안드로이드에서 제공하는 어뎁터이다.
새로운 클래스 만들어 주고.
UserAdapter.kt
BaseAdapter를 상속을 받아 줘라
여기서는 ㅇ
<>안에는 모델, 담기는 배열은 유저모델 형태를 따라라!
모두다 상속을 받아 준다.
가독성을 위해 p0 는 parent로 변경하고
주로 수정할 부분은
제일 밑의 getView() 함수이다.
getView 에서 하는 역할은 ListView 에서 View를 가지고 왔을때, 어떻게 표시해줄거냐
(우리가 방금 디자인한 모델 객체를 사용하여야 함)
LayoutInflater 는 View를 붙이는 과정을 생각하면 됨. 리스트뷰의 한 컬럼 당의 item은 이 형태를 따라줘
package com.example.myapplication
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewParent
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.TextView
class UserAdapter(val context: Context, val UserList: ArrayList<User>) : BaseAdapter() {
override fun getCount(): Int {
return UserList.size
}
override fun getItem(position: Int): Any {
return UserList[position]
}
override fun getItemId(position: Int): Long {
return 0
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val view: View = LayoutInflater.from(context).inflate(R.layout.list_item_user, null)
val time = view.findViewById<TextView>(R.id.tv_time)
val task = view.findViewById<TextView>(R.id.tv_task)
val lock = view.findViewById<TextView>(R.id.tv_lock)
val alarm = view.findViewById<ImageView>(R.id.iv_alarm)
val user = UserList[position]
alarm.setImageResource(user.alarm)
time.text = user.time
task.text = user.task
lock.text = user.lock
return view
}
}
ListView에는 반드시 어뎁터로 연결이 되어주어야 한다.
ListView를 출력할 Activity에 와서
var UserList = arrayListOf<User>(
User("08:10","어머니전화","잠금",R.drawable.bell),
User("09:30","조깅","잠금",R.drawable.bell),
User("09:15","빨래","잠금",R.drawable.bell),
User("10:20","도서관","잠금",R.drawable.bell),
User("11:10","공부","잠금",R.drawable.bell),
User("12:40","병원","잠금",R.drawable.bell),
)
val Adapter = UserAdapter(this,UserList)
binding.listView.adapter = Adapter
이렇게 두 코드를 추가해주면
package com.example.myapplication
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.Toast
import com.example.myapplication.databinding.ActivityListBinding
class ListActivity : AppCompatActivity() {
private lateinit var binding : ActivityListBinding
var UserList = arrayListOf<User>(
User("08:10","어머니전화","잠금",R.drawable.bell),
User("09:30","조깅","잠금",R.drawable.bell),
User("09:15","빨래","잠금",R.drawable.bell),
User("10:20","도서관","잠금",R.drawable.bell),
User("11:10","공부","잠금",R.drawable.bell),
User("12:40","병원","잠금",R.drawable.bell),
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityListBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
var testText = intent.getStringExtra("test")
println(testText)
if(intent.hasExtra("test")){
Toast.makeText(this, testText,Toast.LENGTH_LONG).show()
}
// val item = arrayOf("08:10","08:10","08:10","08:10","08:10")
// binding.listView.adapter = ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1, item)
val Adapter = UserAdapter(this,UserList)
binding.listView.adapter = Adapter
}
}
정리
ListView를 잘 활용하려면
1. 어떠한 방식으로 어떤 값들과 View들의 List 출력될지를 위한 모델객체
를 만들어주고
2. 이를 위한 어뎁터를 기본으로 제공되는 걸 사용하거나 커스텀하여 커스텀 어뎁터를 사용해 주어야 한다.
binding.listView.onItemClickListener =
AdapterView.OnItemClickListener { parent, view, position, id ->
val selectItem = parent.getItemAtPosition(position) as User
Toast.makeText(this, selectItem.time, Toast.LENGTH_SHORT).show()
}
추가적으로 이렇게 ItemClickListent를 구현해 줄 수도 있다.
https://www.youtube.com/watch?v=ao0Iqfhy0oo