프로그래밍/Kotlin

[코틀린/안드로이드] CustomAdapter 활용하여 RecyclerView 사용하기

pupu91 2022. 10. 24. 18:51
반응형

 

 

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

 

 

 

 

 

실행결과

반응형