반응형
[Kotlin] RecyclerView에 ViewBinding 적용하기
목표
ViewBinding 추가하기
- buildGradle.app
android{
viewBinding {
enabled = true
}
}
MainActivity onCreate을 Viewbinding으로 수정해주기
- **AcivityMainBinding 이름은 연결된 layoutxml파일 이름에따라 변경하셔야합니다**
class MainActivity : AppCompatActivity() {
//추가시작
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
//추가끝
}
}
Recyclerview 추가하기 - ViewBinding 적용 전
- 아래 예시 코드는 체크리스트를위한 코드입니다.
- ViewBinding적용전과 후의 리사이클러뷰가 어떻게 변했는지 이해를 돕기 위해 넣었습니다.
//List를 위한 data class생성
data class Todo(val text:String, var isDone:Boolean = false)
class TodoAdapter(private val myDataset: List<Todo>) : //Todo타입인 dataset이 Adapter에 들어간다.
RecyclerView.Adapter<TodoAdapter.TodoViewHolder>() {
class TodoViewHolder(val view: View) : RecyclerView.ViewHolder(view)
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): TodoViewHolder {
val view = LayoutInflater.from(viewGroup.context) //recyclerview에 각 아이템에 들어갈 layout 인플레이트
.inflate(R.layout.item_todo, viewGroup, false)
return TodoViewHolder(view)
}
override fun onBindViewHolder(viewHolder: TodoViewHolder, position: Int) {
val textView = viewHolder.view.findViewById<TextView>(R.id.todo_text)
textView.text = myDataset[position].text //todoadapter에서 들어온 dataset이 여기서 position 0부터 하나씩 접근한다.
}
override fun getItemCount() = myDataset.size //item의 갯수는 myDataset 사이즈만큼
}
Recyclerview 추가하기 - ViewBinding 적용 후
Viewbinding을 위해 바꾼 것들
- view:View → binding:ItemTodoBinding
- RecyclerView.ViewHolder(view) → RecyclerView.ViewHolder(binding.root)
- TodoViewHolder(view) → TodoViewHolder(ItemTodoBinding.bind(view))
- delete findViewById and textview → viewholder.binding.textview
data class Todo(val text:String, var isDone:Boolean = false)
class TodoAdapter(private val myDataset: List<Todo>) :
RecyclerView.Adapter<TodoAdapter.TodoViewHolder>() {
//view 대신 binding으로 넣어준다. view-> recyclerview.viewholder안에도 binding.root로 변환.
class TodoViewHolder(val binding: ItemTodoBinding) : RecyclerView.ViewHolder(binding.root)
//binding의 타입은 item Todobinding인 이유는 리사이클러뷰에 각각 하나씩 들어가는 itemlayout의 이름이 item_todo이기때문이다.
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)) //binding을 access하기위해 itemTodoBinding.bind(view)로
}
//findviewbyId대신 viewholder:binding으로 view access
override fun onBindViewHolder(viewHolder: TodoViewHolder, position: Int) {//view->viewholder로
viewHolder.binding.todoText.text= myDataset[position].text //findViewById대신 viewholder.binding으로 접근
}
//동일
override fun getItemCount() = myDataset.size
}
Recyclerview 추가하기 - RecyclerView oncreate에 선언
- 만든 Recyclerview Adapter와 Viewholder를 MainActivity onCreate에 추가해줍니다.
class MainActivity : AppCompatActivity() {
//추가 시작
private lateinit var binding: ActivityMainBinding
private val data = arrayListOf<Todo>()
//추가 끝
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
//추가 시작
binding.recyclerView.layoutManager = LinearLayoutManager(this)
binding.recyclerView.adapter = TodoAdapter(data)
//추가 끝
참고 자료
다음편에서는 Recyclerview에 아이템을 추가 및 삭제 하는 법을 다뤄보겠습니다.
반응형