기존에는 한화면에서 부모아이템과 상세아이템을 추가했었는데 진행하다보니
뷰에 조금 변화가 있어서 다른 화면에서 아예 리스트를 만들어서 넘겨받아서 업데이트 하는 방식으로
변경하여 다른화면에서 아이템을 추가하는 방식을 만들고 있는데요,
사실 이전에는 멀티타입뷰를 사용해서 했다면 이번에는 그냥 상세아이템만 추가하면돼서
기존의 리사이클러뷰랑 완전히 똑같죠. 간단해졌다는 말이죠..
그런데 문제가 이상하게 아이템 추가를 하면 화면이 업데이트 되지 않는다는 겁니다..
아이템을 클릭하면 아이템이 단하나만 추가되고 이후로는 추가되지 않습니다.
아이템 추가버튼을 클릭했을때를 디버깅을 해보았는데 뷰모델에서 MutableList까지 추가되는것은
확인을했고
추가되면 아이템의 변경사항이 생긴것이니 obeserve까지는 호출이 되는데 submitList는 호출이 되지
않는것 같습니다..새 리스트와 이전리스트를 비교하기위한 DiffUtil 또한 호출되지 않는것같구요..
그런데 바텀 메뉴로 다른화면을 갔다가 다시 돌아오면 화면 아이템이 업데이트 되어있네요..
뭐가 문제인가요..일반 리사이클러뷰인데 갑자기 안되고 이유를 못찾으니 답답하네요..
sealed class
sealed interface RoutineItem {
val id: String
data class Header(
override val id: String = UUID.randomUUID().toString(),
val workout: String,
val unit: String,
) : RoutineItem
data class Detail(
override val id: String = UUID.randomUUID().toString(),
val set: Int,
var weight: String = "",
var reps: String = "",
) : RoutineItem
}
fragment
class WriteRoutineFragment2 : Fragment() {
private var _binding : FragmentWriteRoutine2Binding? = null
private val binding get() = _binding!!
val args: WriteRoutineFragment2Args by navArgs()
lateinit var workout: String
private lateinit var adapter: DetailAdapter
private val vm : DetailViewModel by viewModels { DetailViewModelFactory() }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
args?.let {
workout = it.workout.toString()
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentWriteRoutine2Binding.inflate(inflater, container, false)
adapter = DetailAdapter()
binding.apply {
rv.adapter = adapter
rv.itemAnimator = null
header.add.setOnClickListener {
vm.addDetail()
}
header.delete.setOnClickListener {
vm.deleteDetail()
}
header.toggleButton.addOnButtonCheckedListener { _, checkedId, _ ->
when(checkedId) {
R.id.kg -> Toast.makeText(context, "checkedId: $checkedId", Toast.LENGTH_SHORT).show()
R.id.lb -> Toast.makeText(context, "checkedId: $checkedId", Toast.LENGTH_SHORT).show()
}
}
}
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
vm.items.observe(viewLifecycleOwner) { newList ->
adapter.submitList(newList) // 새로운 리스트를 넘김.
}
}
}
adapter
class DetailAdapter
: ListAdapter<RoutineItem.Detail, DetailAdapter.ViewHolder>(DetailDiffCallback()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(
ItemRoutineDetailBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
}
inner class ViewHolder(val binding: ItemRoutineDetailBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: RoutineItem.Detail) {
}
}
}
DiffUtil
class DetailDiffCallback : DiffUtil.ItemCallback<RoutineItem.Detail>() {
override fun areItemsTheSame(
oldItem: RoutineItem.Detail,
newItem: RoutineItem.Detail
): Boolean = (oldItem.id == newItem.id)
override fun areContentsTheSame(
oldItem: RoutineItem.Detail,
newItem: RoutineItem.Detail
): Boolean = (oldItem == newItem)
}