리사이클 뷰에 대해 얘기해보겠다.
일단 RecycleView에 넣을 item-Layout을 생성하자.
RecycleView는 item-Layout의 리스트다.
//일단 넣을 배열을 생성한다. 여기선 단순하게 만들었지만
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
}
이제 틀을 넣어보자.
//1. 데이터를 불러온다.
val data = loadData()
//2. 아다터를 생성
val customAdapter = CustomAdapter(data)
//3. 화면의 RecyclerView와 연결
binding.recyclerView.adapter = customAdapter
//4. 레이아웃 매니저 설정
binding.recyclerView.layoutManager = LinearLayoutManager(this)
Adapter가 세팅되면 메인의 할일은 끝난다.
어뎁터는 내부클래스로도 선언할 수 있고, 외부에 빼서 모듈화 시킬수 있다.
뭐가 옳은지는 모르겠지만, 유지보수면에서는 모듈화가 훨씬 편하지 않을까?
class CustomAdapter(val listData: MutableList<Memo>) :
RecyclerView.Adapter<CustomAdapter.Holder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
val binding = ItemRecycleBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return Holder(binding)
}
override fun getItemCount() = listData.size
override fun onBindViewHolder(holder: Holder, position: Int) {
// 1. 사용할 데이터를 꺼낸다.
val memo = listData.get(position)
// 2. 폴더에 데이터를 전달한다.
holder.setMemo(memo)
}
//1. 홀더를 먼저 생성한다.
class Holder(val binding: ItemRecycleBinding) : RecyclerView.ViewHolder(binding.root) {
lateinit var currentMemo: Memo
// 클릭처리는 init에서만 한다.
init {
binding.root.setOnClickListener {
val title = binding.TextTitle.text
Toast.makeText(
binding.root.context,
"클릭된 아이템 : ${currentMemo.title}",
Toast.LENGTH_LONG
).show()
}
}
//3. 받은 데이터를 화면에 출력한다.
fun setMemo(memo: Memo) {
currentMemo = memo
with(binding) {
TextNo.text = "${memo.no}"
TextTitle.text = "${memo.title}"
val sdf = SimpleDateFormat("yyyy-MM-dd")
val formattedDate = sdf.format(memo.timestamp)
TextDate.text = "${formattedDate}"
}
}
}
차근차근 보자면..
//1. 홀더를 먼저 생성한다.
class Holder(val binding: ItemRecycleBinding) : RecyclerView.ViewHolder(binding.root) {
//Recycle이기 때문에 bind로 호출하면 값이 꼬일수도 있다.
lateinit var currentMemo: Memo
// 클릭처리는 init에서만 한다.
init {
binding.root.setOnClickListener {
val title = binding.TextTitle.text
Toast.makeText(
binding.root.context,
"클릭된 아이템 : ${currentMemo.title}",
Toast.LENGTH_LONG
).show()
}
//Memo를 세팅해주는 역할이다. 값을 매핑해준다.
fun setMemo(memo: Memo) {
currentMemo = memo
with(binding) {
TextNo.text = "${memo.no}"
TextTitle.text = "${memo.title}"
val sdf = SimpleDateFormat("yyyy-MM-dd")
val formattedDate = sdf.format(memo.timestamp)
TextDate.text = "${formattedDate}"
}
}
그후에 Override를 채운다.
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
// 일반적으로 이렇게 쓰인다. 모듈화때만 ViewType을 통해 변경되는것이 있다.
val binding = ItemRecycleBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return Holder(binding)
}
override fun getItemCount() = listData.size
override fun onBindViewHolder(holder: Holder, position: Int) {
// 1. 사용할 데이터를 꺼낸다.
val memo = listData.get(position)
// 2. 홀더에 데이터를 전달한다.
holder.setMemo(memo)
}
모듈화한 Adapter는 후에 다루도록 하겠다.