-
개인 과제 트러블 슈팅 - filterAndroid 2024. 5. 8. 22:55
문제 상황
하트를 취소하고 내 보관함으로 이동하면 기본 레이아웃이 나온다. 나는 이걸 없애야 하는데..
해결 방법1
// StoreAdapter.kt fun bind(item: DocumentResponse) { Log.d("item",item.toString()) if (item.status == true) { Glide.with(context) .load(item.thumbnailUrl) .into(binding.ivPerson) binding.tvSitename.text = item.displaySitename binding.tvDatetime.text = simpleDateFormat.format(item.datetime) } else if(item.status == false) { binding.storeRecyclerview.visibility = View.GONE // 당장 문제는 해결 가능하지만, 여전히 recyclerView에 담겨있다는 문제점이 발생 (리소스 낭비) } }
일단, 좋아요 값을 true, false로 받고
false인 경우 해당 리사이클러뷰의 visibility를 GONE으로 설정했다.
해결 시연영상
해결 방법1의 한계
GONE으로 처리하면 뷰에서 안보일 뿐, 데이터는 여전히 남아있어서 리소스가 낭비된다고 판단했다.
해결 방법2
어떻게 할까 하다가 fragment에서 adapter 로 데이터를 넘겨줄 때 filter를 걸어서 하트가 눌린 것만 넘겨주도록 바꾸었더니 드디어 해결되었다. (기존에는 false 값도 넘겨줬었다)
heartImageList = storeImageList?.filter { it.status == true } as ArrayList<DocumentResponse> binding.storeRecyclerview.apply { adapter = heartImageList?.let { StoreAdapter(it, requireContext()) } .. }
어댑터에서도 item status를 true false로 분기 처리 안해줘서 더 코드가 간결화되었다(?)
fun bind(item: DocumentResponse) { Log.d("item", item.toString()) // 이 로그캣 진짜 도움 많이 됨 // itemView.setOnClickListener { // itemClickRemove?.deleteItem() // } Glide.with(context) .load(item.thumbnailUrl) .into(binding.ivPerson) binding.tvSitename.text = item.displaySitename binding.tvDatetime.text = simpleDateFormat.format(item.datetime) }
결론
리사이클러뷰 내에서 조건처리 해서 힘들게 데이터 뽑아내지 말고, 아예 처음부터 데이터를 전달할 때 미리 filter 등으로 뽑아서 주자.
'Android' 카테고리의 다른 글
팀 프로젝트 트러블 슈팅 - suspend fun, viewModelScope.launch (0) 2024.05.10 개인 과제 트러블 슈팅 - 인터페이스 변수 초기화 (0) 2024.05.09 개인 과제 트러블 슈팅 - 프래그먼트 트랜잭션 (0) 2024.05.07 시간복잡도 줄이기(약수의 개수) (0) 2024.05.03 MVC, MVVM, Repository Pattern (0) 2024.05.02