ㄱ
data class RoutineModel(
val id: String,
val workout: String,
val unit: String,
) {
private var routineDetail: ArrayList<RoutineDetailModel> = arrayListOf()
init {
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(),
val set: Int,
var weight: String = "" ,
val reps: String = "1" ) {
}
|
// 가공을 위한 RoutineItem클래스
sealed class RoutineItem(
val id: String,
val layoutId: Int
) {
class RoutineModel(
id: String,
val workout: String,
val unit: String,
) : 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에서 데이터를 가공해도 될까요?