JSON Dataclass에 주어진 값 이외의 값을 넣어보자

1

AndroidStudio

목록 보기
1/83

시작

한개의 리사이클러뷰에 여러개의 어댑터를 달아야 하는 상황이 있다.

getItemViewType 을 사용하기 위해서는 api를 통해 들어오는 데이터들에게 새로운 변수를 만들어주고 그것을 그룹에 따라 나눠주는 기준을 정해야 했다.

과정

  1. JSON을 받아오는 data class = Response에 type이라는 변수를 정하고 바로 값을 지정해주는것.

→ type은 생성이 되었다. 하지만, type = 0 으로 값이 정해졌다.

  1. 어노테이션의 문제인가? 라는 생각이 들어 @Expose, @SerializedName 을 붙여보았지만 실패

  2. 메인 액티비티에서 consult,company,expert에 따라서 3개의 리스트를 만들었다.
    그리고 그 후에 각각의 리스트가 채워질때마다 forEach를 돌려 it.type의 값을 지정해주었다.

→ 성공case

class MainActivity : AppCompatActivity() {
    private lateinit var binding : ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.recyclerview.layoutManager= LinearLayoutManager(this, RecyclerView.VERTICAL,false)

        DocFriendsAPI.invoke(this).getInfo()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({it->
								var listone = it.companyList
                var listtwo = it.consultList
                var listthree = it.expertList
                binding.recyclerview.adapter= QnaAdatper(it.consultList)
                listone.forEach{
                    it.type = DocFriendsResponse.IMAGE_TYPE
		}
		listtwo.forEach{
                    it.type = DocFriendsResponse.IMAGE_TYPE2
		}
		listthree.forEach{
                    it.type = DocFriendsResponse.IMAGE_TYPE3
		}
// 요청성공 = onResponse
		},{
// 요청실패 = onFailure
		})
	}
}

//data class의 일부분.

data class Consult(
    var type : Int = IMAGE_TYPE,
    @SerializedName("seq")
    val seq: Int,
    @SerializedName("title")
    val title: String,
    @SerializedName("context")
    val context: String,
    @SerializedName("regDate")
    val regDate: Long,
    @SerializedName("answerCnt")
    val answerCnt: Int,
    @SerializedName("tagList")
    val tagList: List<Tag>
) 

companion object {
        const val IMAGE_TYPE = 0
        const val IMAGE_TYPE2 = 1
        const val IMAGE_TYPE3 = 2
    }

data class에서 받아올때 지정하면 깔끔하게 성공할 줄 알았으나 실패했다.

forEach 말고 좀 더 세련된 방법이 있을것으로 예상이 되지만, 아직 찾지 못함.

2021.08.06

자바에서는 위의 방법으로 data class에서 직접 바꿔주면 가능했었다. 하지만 코틀린에서 안되는것을 생각하다가 자바처럼 get을 따로 만들어서 받아주면 어떨까? 라는 생각이 들었다.

class Company(
        @SerializedName("companyName")
        val companyName: String,
        @SerializedName("address")
        val address: String,
        @SerializedName("addressEtc")
        val addressEtc: String,
        @SerializedName("introPath")
        val introPath: String
    ){
        val type : Int
        get() = 2
    }

💡성공

profile
러닝커브를 따라서 등반중입니다.

0개의 댓글