ㄱ
// 비지니스 로직에 사용될 Model 클래스
data class RoutineModel(
val id: String, // 고유 id (UUID 사용)
val workout: String, // 운동 종목
val unit: String, // 무게 단위 (kg or lbs)
) {
private var routineDetail: ArrayList<RoutineDetailModel> = arrayListOf()
init {
// 루틴 생성시과 동시에 1개의 상세 아이템을 가지고 있게 하기 위함
val detail = RoutineDetailModel(UUID.randomUUID().toString(),1,"")
routineDetail.add(detail)
}
fun getSubItemList() : ArrayList<RoutineDetailModel> = routineDetail
fun getSubItemSize() = routineDetail.size
}
data class RoutineDetailModel(
val id: String = UUID.randomUUID().toString(), // UUID
val set: Int, // 세트
var weight: String ="",
val reps: String = "1") {
}
// 가공을 위한 RoutineItem클래스
// 가공된 데이터를 RV(Epoxy)에 나열하기 위한 클래스
sealed class RoutineItem(
val id: String,
val layoutId: Int
) {
class RoutineModel(
id: String, // Id, UUID 사용
val workout: String, // 운동 종목
val unit: String, // 무게 단위 (kg or lbs)
// var routineDetail: List<DetailModel> = listOf() // 여기다가 넣는다면?
) : RoutineItem(id, VIEW_TYPE) {
companion object {
const val VIEW_TYPE = R.layout.item_routine
}
}
class DetailModel(
id: String,
val set: Int, // 세트
var weight: String,
val reps: String = "1",
) : RoutineItem(id, VIEW_TYPE) {
companion object {
const val VIEW_TYPE = R.layout.item_routine_detail
}
}
}
// RecyclerView에 보여줄 형태로 RoutineModel 리스트를 가공
fun getListItems() : List<RoutineItem> {
val listItems = arrayListOf<RoutineItem>() // 에폭시에 나열하기 위한 가공된 최종 리스트
for(tempRm in _items.value!!) {
listItems.add(RoutineItem.RoutineModel(tempRm.id,tempRm.workout,tempRm.unit))
val childListItems = tempRm.getSubItemList().map { detail ->
RoutineItem.DetailModel(detail.id, detail.set, detail.weight,"55")
}
listItems.addAll(childListItems)
}
return listItems
}
즉 그러니까 RoutineModel 클래스와 RoutineModel내에 잇는 Detail들을 가공하여
List<RoutineItem> 형태로 만들어 펼치는 겁니다. 이렇게해서 이 리스트를 ㄹ리사이클러뷰에 뿌리는 형태인데,
이제 아이템을 추가 및 삭제할때가 문제인데요, 이전에는 아이템마다 UUID를 사용해서
비교했었는데 굳이 Adapter내에 bindingAdapterPosition를 냅두고 id를 비교해야하여 위치를 찾고 Detail아이템을 추가 및 삭제할 필요가 있나 의문듭니다.
어댑터의 bindingAdapterPostion을 사용하면 혹시 모를잘못된 위치?를 파악하지 않아도 될거고.. id 비교도 굳이하지 않아도 된다는 점이 즉 안정성 측면?이 이점일거같은데요..
단점은 위에서 말했다시피 List<RoutineModel>에 존재하는 데이터들을 펼쳐서(가공해서) List<RoutineItem>만들었고 이것이 곧 리사이클러뷰에 보여질 리스트들인데요,
만약에 bindingAdapterPosition을 사용하면 아이템을 클릭했을때 이 아이템들의 위치가 반환되겠죠,
그런데 정작 아이템이 추가되고 삭제되는것은 List<RoutineModel>이라 이 반환된 위치값과
RoutineModel에 존재한 아이템의 위치가 알맞지 않다는 것입니다.
그래서 이것때문에 결국 UUID를 사용해야하나 하는 생각이드는데 어떻게 하는것이 올바를까요?
++)Repository에서 데이터를 가공해도 될까요?