한개의 리사이클러뷰에 여러개의 어댑터를 달아야 하는 상황이 있다.
getItemViewType 을 사용하기 위해서는 api를 통해 들어오는 데이터들에게 새로운 변수를 만들어주고 그것을 그룹에 따라 나눠주는 기준을 정해야 했다.
→ type은 생성이 되었다. 하지만, type = 0 으로 값이 정해졌다.
어노테이션의 문제인가? 라는 생각이 들어 @Expose, @SerializedName 을 붙여보았지만 실패
메인 액티비티에서 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 말고 좀 더 세련된 방법이 있을것으로 예상이 되지만, 아직 찾지 못함.
자바에서는 위의 방법으로 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
}
💡성공