티스토리 뷰

반응형

해당 프로젝트의 이전에 작성한 코드를 뷰바인딩으로 바꿔보겠습니다.

모듈 단위의 build.gradle에 뷰 바인딩을 선언하면, 레이아웃 XML 파일들의 이름 뒤에 Binding이 붙은 채로 클래스가 생성되게 됩니다.

 

우선 아래의 코드 처럼, 전역 변수로 binding을 선언하는데, 타입으로는 뷰 결합으로 생성된 ActivityMainBinding을 지정합니다. 그리고 binding에 layoutInflater로 뷰를 가져올 수 있도록 선언하고, view에는 binding.root를 선언합니다.

binding.root는 바인딩이 가지는 프로퍼티인데 root를 통해서 어떤 뷰를 가지고 있는지 알게됩니다. 이로써 binding을 사용해 원하는 XML 뷰를 가져올 수 있습니다.

private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
}
반응형

그리고 뷰홀더 클래스는 바인딩된 객체를 인자를 갖도록 바꿔줍니다. binding의 타입으로는 바인딩으로 새로 만들어진 아이템 항목들이 들어가는 뷰 클래스를 지정합니다. 해당 뷰홀더 클래스의 리턴 타입을 잘보면, binding.root를 뷰 홀더 메소드가 담고 있는데, 위에서 설명한 바와 같이 root는 binding이 가지는 뷰 객체를 알려줍니다.

class TodoViewHolder(val binding: ItemTodoBinding) : RecyclerView.ViewHolder(binding.root) {
      *** 생략 ***
}

 

뷰를 만들어주는 클래스를 보겠습니다. ItemTodoBinding에서 bind 메소드에 선언된 view를 넣어줌으로써, 해당 뷰에 포함된 것들을 바인딩 객체로 만들어 접근할 수 있도록 합니다. 이러한 바인딩된 객체들을 뷰홀더에 담아 리턴해줍니다.

binding에서 접근하는 root 프로퍼티로 인해, 어떤 뷰로부터 생성된 바인딩인지 알 수 있습니다. bind(view)의 view는 root에서 전달되는 것이라고 볼 수 있습니다.

override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): TodoViewHolder {
        val view = LayoutInflater.from(viewGroup.context)
            .inflate(R.layout.item_todo, viewGroup, false)

        return TodoViewHolder(ItemTodoBinding.bind(view))
}

실제 뷰가 표현되는 onBindViewHolder 부분에서는 바인딩된 todoText의 텍스트에 List<Todo>의 텍스트를 할당합니다.

holder.binding.todoText.text = dataSet[position].text

onCreate 메소드 부분에 binding을 사용해서 레이아웃 매니저와 어댑터를 지정해 줍니다.

binding.recyclerView.layoutManager = LinearLayoutManager(this)
binding.recyclerView.adapter = TodoAdapter()

 

업무를 data라 지칭하고, 어댑터에 연결하여 추가하도록 합니다. 우선 데이터를 arrayListOf로 선언합니다.

private val data = arrayListOf<Todo>()

 

데이터를 넣으면 아이템으로써 추가가 될 수 있게 내부에서 사용하는 private 함수를 만들어줍니다. Todo 클래스에서 받는 text는 입력을 받는 부분의 문자열이므로 binding.editText.text.toString( )으로 받습니다. isDone 인자는 디폴트로 지정해 놓았기 때문에 생략하였습니다. 

그리고 데이터가 추가되면, 이를 어댑터에 알려야 하므로 notifyDataSetChanged( )를 사용합니다. 이때 Null 값을 방지하기 위해 ?를 사용합니다.

private fun addTodo(){
        val todo = Todo(binding.editText.text.toString())
        data.add(todo)
        binding.recyclerView.adapter?.notifyDataSetChanged()
}
반응형
댓글