GDSC HUFS 3기/Android with Kotlin Team 4

[4팀]14-4. 화면 구성하기:리사이클러뷰

gusals42 2021. 11. 8. 07:24

이 글은 이것이 안드로이드다 with 코틀린(개정판)를 참고하여 작성하였습니다.

작성자 : 정현민

개발환경은 Windows, Android Studio입니다.

 

 

1. 리사이클러뷰란?

"많은 수의 데이터 집합을, 제한된 영역 내에서 유연하게(flexible) 표시할 수 있도록 만들어주는 위젯"

 

 

2. 리사이클러뷰 설정

MainActivity>recycleview>ID와 constraint설정 title: RecycleView

res>layout>우클릭>New>layout Resource File

(+root element를 바꿔주면 코드도 자동으로 바뀐다)

현재 레이아웃에서 textView 3개 입력>속성 weight값 1:5:3으로 입력>layout width값=0 (비율 적용)

new>kotlin File/Class>'memo'라는 이름의 class 생성

3. data class 설정

//memo
data class memo (var no:Int, var title:String, var timestamp:Long)

-데이터 구조를 잡기 위해 data class를 설정하는 코드

 

4. data 생성

// MainActivity
	fun loadData(): MutableList<memo>{
        val memoList = mutableListOf<memo>()
        for(no in 1..100){
            val title = "이것이 안드로이드다 $no"
            val date = System.currentTimeMillis()
            val memo = memo(no, title, date)
            memolist.add(memo)
        }
        return memolist
    }

-가상의 데이터를 생성하는 code

$no: 타이틀이 똑같으면 안되니깐 증가하는 숫자를 붙여 구분하기 위함

✔100개의 memolist를 생성받을 수 있도록 반복문 구조

 

5. adapter을 이용하여 item을 화면에 출력하기

※adapter 생성 코드를 만들기 전 build.gradle에 가서 binding을 먼저 해야함

buildFeatures{
	viewBinding true
}

class CustomAdapter(val listData:MutableList<memo>) : RecyclerView.Adapter<CustomAdapter.Holder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        val binding = ItemRecyclerBinding.inflate(LayoutInflater.from((parent.context),parent, false))
        return Holder(binding)
    }

    override fun onBindViewHolder(holder: Holder, position: Int) {
        //1. 사용할 데이터를 꺼내고
        val memo = listData.get(position)
        //2. 홀더에 데이터를 전달
        holder.setmemo(memo)
    override fun getItemCount(): Int {
        return listData.size
    }

-adapter 생성하는 코드

✔RecyclerView.Adapter을 상속받아 CustomAdapter 생성 

✔adapter가 holder를 가지고 item layout에 값을 세팅할 것이라는 의미

✔binding 코드까지 작성한 후 Ctrl+i를 입력해 override 3가지를 입력

(+override fun getItemCount() = listData.size로 짧게 변경 가능)

 

화면에 보이는 만큼만 생성해놓고 재사용 하는 것이 recycler의 특징!!

 

class Holder(binding:ItemRecyclerBinding):RecyclerView.ViewHolder(binding.root){
        //3.받은 데이터를 화면에 출력한다.
        fun setmemo(memo:memo){
            with(binding){ItemRecyclerBinding
                textNo.text="${memo.no}"
                textTitle.text =memo.title
                
                val sdf = SimpleDateFormat(pattern;"yyyy-MM-dd")
                val formattedDate = sdf.format(memo.timestamp)
                textDate.text = formattedDate
        	}
    	}
}

-adapter에 전달된 목록을 가지고 각각의 item화면에 출력하는 code

✔날짜는 simple date format(sdf)를 이용하여 timestamp를 날짜 형태로 변환

 

val binding by lazy {ActivityMainBinding.inflate(LayoutInflater)}

이 코드를 이용해 전체 코드를 연결한다.