Android

[삽질] Recycler View 값이 없을 때 안보이게 하기

김한토 2024. 6. 8. 14:21
반응형

?? 바텀 네비게이션 왜저래

 

고치고 왔다 ㅎㅎ

 

우리 프로젝트는 링크 저장을 편하게 해주는 어플이다.  링크를 저장할때 저장했던 맥락을 기록할 수 있고 관련해서 태그도 달 수 있다. 그리고 태그 별로 링크(훅)을 모아서 볼 수도 있따.

 

홈뷰 형식은 리사이클러 뷰 안에 리사이클러 뷰를 삽입하였다..

 

매일 매일 직접 앱을 써보며 테스트를 하던 중 

 

 

태그가 없을때 잘 나오던 훅이 

 

 

이런식으로 빈값이 태그로 인식되어 리사이클러 뷰에 보이고 있었다.

 

기존 코드는 태그리스트에 아무런 값이 없을때 GONE을 사용해서 화면에 안보이게 하고 있었다.

 

그런데 API가 바뀌면서 뭐가 잘못되었는지 저렇게 ""값이 전달되어 태그에 나오고 있었따.

 

1. 태그리스트 값이 비어 있으면 null값 전달하기 

APIServiceMaganer를 보니

 

suspend fun managerCreateHook(title: String, description: String, url: String, tag: ArrayList<String>): ApiResponse {
        val request = HookRequest(title, description, url, tag)
        return handleApiResponse { apiService.createHook(request) }
    }

 

tag값이 nullable이 안되어 있어 null값을 반환하지 못하나? 했다.

그래서 null값을 허용해주고 다시 시도해 보았지만 여전히 문제는 그대로였따.

 

로그를 찍어봤는데 빈태그 값은 null로 잘 전달이 되는데 뭐가 문제지? 싶었다.

그리고 다른 description도 null값 허용이 되지 않는데 화면에 잘 반영되는 것을 보아하니 api쪽 코드는 건드리지 않기로 하였따.

 

2. hookAdapter수정하기

 

null값이나 empty값이 들어오면 gone을 하는 코드를 살펴보았다.

들어오는 값이 맞는지 확인하기 위해 로그를 찍어보았는데 글쎄

Content: [Tags(id=82, createdAt=2024-06-07T02:36:10.302Z, userId=5, displayName=)]

태그 값에 아이디랑 생성시간, 유저아이디가 전달되고있었따..

 

아맞다..

package com.hanto.hook.model

import com.google.gson.annotations.SerializedName

data class Hook (
    @SerializedName("id"          ) var id          : Int?    = null,
    @SerializedName("createdAt"   ) var createdAt   : String? = null,
    @SerializedName("updatedAt"   ) var updatedAt   : String? = null,
    @SerializedName("deletedAt"   ) var deletedAt   : String? = null,
    @SerializedName("userId"      ) var userId      : Int?    = null,
    @SerializedName("title"       ) var title       : String? = null,
    @SerializedName("description" ) var description : String? = null,
    @SerializedName("url"         ) var url         : String? = null,
    @SerializedName("tags"        ) var tags        : List<Tags>? = null
)

data class Tags (
    @SerializedName("id"          ) var id          : Int?    = null,
    @SerializedName("createdAt"   ) var createdAt   : String? = null,
    @SerializedName("userId"      ) var userId      : Int?    = null,
    @SerializedName("displayName" ) var displayName : String? = null
)

 

Tags 객체 값에는 4개의 변수가 전달되는데 나는 displayName만 고려하고 있어서 display가 빈값이거나 null일때를 처리했어야했다..

 

hook.tags?.let { tags ->
                val validTags = tags.filter { !it.displayName.isNullOrEmpty() }
                if (validTags.isNotEmpty()) {
                    binding.rvTagContainer.apply {
                        layoutManager = FlexboxLayoutManager(binding.root.context).apply {
                            flexDirection = FlexDirection.ROW
                            justifyContent = JustifyContent.FLEX_START
                        }
                        adapter = TagHomeAdapter(validTags.map { it.displayName!! }, hook)
                        visibility = View.VISIBLE
                    }
                } else {
                    binding.rvTagContainer.visibility = View.GONE
                }
            } ?: run {
                binding.rvTagContainer.visibility = View.GONE
            }

 

코드를 이렇게 수정하니 다시 예쁘게 값이 나왔다..ㅎㅎ ♥

 

반응형

'Android' 카테고리의 다른 글

Android studio 버전 다른거 여러개 깔기  (1) 2024.07.26
[삽질] Dialog 커스텀해서 쓰기 ! (input있는 dialog)  (0) 2024.06.12
Room  (1) 2024.06.04
코루틴  (0) 2024.05.24
동기 / 비동기  (0) 2024.05.20