반응형
activity_main.xml
item_recycler.xml
viewBinding 설정
data class 생성
package com.greedy.recyclerview
import java.sql.Timestamp
data class Memo (var no: Int, var title: String, var timestamp: Long)
MainAcivity.kt
class MainActivity : AppCompatActivity() {
val binding by lazy { ActivityMainBinding.inflate(layoutInflater)}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
/* loadData를 통해서 Memo 샘플 데이터 100개 생성 */
val data: MutableList<Memo> = loadData()
/* CustomAdapter 생성 */
var adapter = CustomAdapter() //실제 뷰와 데이터를 연결해 줄 어뎁터
adapter.listData = data
/*RecyclerView의 adapter에 CustomAdapter 설정*/
binding.recyclerView.adapter = adapter
/* 리사이클리뷰에 화면을 보여주는 형태를 결정한느 레이아웃 매니저 연결*/
binding.recyclerView.layoutManager = LinearLayoutManager(this)
}
//반복문을 통해서 백번돌리고 메모 객체 반환
fun loadData(): MutableList<Memo>{
val data: MutableList<Memo> = mutableListOf()
for(no in 1..100){
val title = "테스트 메모 제목입니다.$no"
val date = System.currentTimeMillis()
var memo = Memo(no, title, date)
data.add(memo)
//메모라는 메모데이터 객체를 만드는데, data쪽(리스트)d에 저장해서 반환
}
return data
}
}
CustomAdapter class 생성
/*RecyclerView 화면에 뿌려주기 위한 데이터와 어뎁터 정의*/
class CustomAdapter : RecyclerView.Adapter<Holder> () {
/* RecyclerView에서 사용할 Memo Data*/
var listData = mutableListOf<Memo>()
/* 아이템 레이아웃을 생성하는 콜백 메소드 */
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
/* 첫 번째 인자 : 해당 뷰가 속한 뷰 그룹의 context를 이용하여 layoutInflater를 만들어 전달
두 번째 인자 : 인플레이션을 진행할 뷰 그룹을 전달
세 번쨰 인자 : true인 경우 root를 지정하고 그 아래 인플레이션 화면을 붙이지만,
flase인 경우 최상위 레이아웃의 속성을 기본으로 레이아웃 적용(리사이클러의 레이아웃)
inflate : xml파일을 읽어와서 객체화*/
val binding = ItemRecyclerBinding.inflate(LayoutInflater.from(parent.context), parent, false)
/* binding을 전달한 Holder 객체를 반환 */
return Holder(binding)
}
/* data를 바인딩하는 콜백 메소드
위에서 반환 한 holder가 여기 메소드로 넘어옴, 레이아웃 생성은 한번, 데이터 값만 여러번 변환*/
override fun onBindViewHolder(holder: Holder, position: Int) {
val memo = listData[position]
holder.setMemo(memo)
}
override fun getItemCount(): Int {
return listData.size //listData가 총 몇개의 아이템을 가지고 있는지 반환
}
}
class Holder(val binding: ItemRecyclerBinding) : RecyclerView.ViewHolder(binding.root){
/* 각 메모를 클릭 했을 때 동작하는 이벤트 */
init{
/* 리사이클리뷰 레이아웃의 최상단 루트는 item_recycler에 작성한 레이아웃인 LinearLayout이다*/
binding.root.setOnClickListener{
/* 간단하게 토스트 메세지를 띄웠지만 메모 상세보기로 startActivity를 호출하여 새로운 액티비티를 보여주는 형태로 처리할 수 있다.*/
Toast.makeText(binding.root.context, "클릭 된 아이템 : ${binding.textTitle.text}", Toast.LENGTH_SHORT).show()
}//init블럭 역시 holder가 만들어질 때마다 동작?
}
//바인딩(ItemRecyclerBinding을 읽어와서 객체화 시킴)을 전달 받아서 무언갈 처리할 수 있는 메소드(메모값을 set처리)
fun setMemo(memo: Memo){
binding.textNo.text = "${memo.no}"
binding.textTitle.text = "${memo.title}"
binding.textDate.text = SimpleDateFormat("yyyy/MM/dd").format(memo.timestamp)
}
}
실행결과
반응형
'프로그래밍 > Kotlin' 카테고리의 다른 글
[코틀린/안드로이드] Spinner 사용하기 (simple_list_item_1, Adapter) (0) | 2022.10.24 |
---|---|
[코틀린/안드로이드] Intent를 활용하여 Activity 전환하기 (0) | 2022.10.24 |
[코틀린 / Kotlin] 컬렉션 Set , Map (mutableSetOf() , Pair) (0) | 2022.10.20 |
[코틀린 / Kotlin] 컬렉션 _ List (add, remove, removeAt, contains, listOf ...) (0) | 2022.10.20 |
[코틀린 / Kotlin] 상속과 오버라이딩 (0) | 2022.10.20 |