본문 바로가기
Android

Android Studio, Kotlin] 코틀린 익스텐션을 이용한 리사이클러뷰 제작

by 김마리님 2020. 12. 29.

itstudy-mary.tistory.com/209?category=929375

 

안드로이드 스튜디오, JAVA] 리사이클러 뷰(recycler View)

https://itstudy-mary.tistory.com/208 안드로이드 스튜디오,JAVA] 커스텀 리스트뷰에 이미지 넣기 https://itstudy-mary.tistory.com/207 안드로이드 스튜디오, JAVA] 커스텀 리스트뷰(ListView) 만들기 https://..

itstudy-mary.tistory.com

기존에 자바야 리사이클러뷰가 쉽고.... 회사 와서도 정말 엄청 많이 쓴게 리사이클러뷰이다.

이걸 이제 코틀린으로 개발한다.

 

리사이클러뷰에 필요한것은 두 가지이다

1. 리사이클러뷰의 데이터를 바인딩할 뷰홀더

2. 뷰홀더를 호출하고, 뷰홀더를 바인딩하는 어댑터

 

이 두 가지는 자바도 만들었지만 코틀린도 만들어야 한다 ^^ ..

 

먼저 뷰홀더를 만든다(필자는 이제 리사이클러뷰를 만들때 어댑터와 뷰홀더를 따로 쓰는 것이 익숙하다..)

 

 

-TestViewHolder.kt

package com.mary.kotlintest.adapter

import android.view.View
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.viewholder_test.view.*

class TestViewHolder(v : View) : RecyclerView.ViewHolder(v) {

    var view : View = v

    fun updateView(item : String) {
        view.textView.text=item
    }

}

뷰를 선언하는 형태가 좀 달라졌다.

기존의 자바 뷰홀더는

1. 뷰 전역변수 초기화

2. 생성자를 따로 만들어 뷰를 호출한 후에

3. 뷰를 참조해야했는데,

코틀린은 그럴 필요 없이 어댑터에서 뷰를 선언할때 받아온 매개변수를 그대로 뷰로 활용할 수 있다. 

뷰에서 뷰아이디를 찾아서 그대로 집어넣으면 끝난다.

 

그래서, 코틀린의 뷰홀더는 따로 implement 할 메서드가 없다.

 

 

- TestAdapter.kt

package com.mary.kotlintest.adapter

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.mary.kotlintest.R

class TestAdapter(private val itemList : List<String>) : RecyclerView.Adapter<TestViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TestViewHolder {
        val inflateView = LayoutInflater.from(parent.context).inflate(R.layout.viewholder_test, parent, false)
        return TestViewHolder(inflateView)
    }

    override fun onBindViewHolder(holder: TestViewHolder, position: Int) {
        val item = itemList[position]
        holder.apply {
            updateView(item)
        }
    }

    override fun getItemCount(): Int {
        return itemList.size
    }
}

 

onCreate에는 큰 변화가 없지만 bind하는 방식에 변화가 생긴다. 홀더에 apply 하면 홀더 내부의 함수를 참조할 수 있어진다.

 

itemList를 직접 참조해도 되고, 아니면 notify를 사용해도 되고.. 이건 본인 재량인듯?

 

마지막으로 메인에서 어댑터와 레이아웃 매니저만 설정하면 완료된다.

package com.mary.kotlintest

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.mary.kotlintest.adapter.TestAdapter
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    private val list : List<String> = listOf(
            "test1", "test2", "test3", "test4"
    )


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        loadText()
    }


    private fun loadText() {
        textView.text = "테스트 아님"

        val adapter = TestAdapter(list)
        //val layoutManager = GridLayoutManager(this,2)
        val layoutManager = LinearLayoutManager(this)
        recyclerView.layoutManager = layoutManager
        recyclerView.adapter = adapter
    }
}



 

자주 사용하는 레이아웃 매니저는 linear이다.

말 그대로 linearLayout처럼 아래로 쭉 나온다.

 

그러나 한 요소를 표처럼 배치하고 싶어질때가 있는데, 그럴 때 이용하는 것이 GridLayoutManager이다.

(주석처리 되어있음. 기존 context가 첫번째 매개변수로, 두번째 매개변수는 span 값이 들어간다.)

 

 

반응형