문제점 : API를 이용해서 서버에서 데이터를 받아왔는데 앱에 표시가 안된다.
해결 과정
▼ ViewModel ▼
apiService.getFavorites("snippet","mostPopular",10,"0")
?.enqueue(object : Callback<FavoritesData?> {
override fun onResponse(call: Call<FavoritesData?>, response: Response<FavoritesData?>) {
response.body()?.let {
for(favorites in response.body()!!.items){
val title = favorites.snippet.title
val url = favorites.snippet.thumbnails.default.url
youtubeItems.add(YoutubeModel(Constants.FAVORITES_TYPE,title,url))
Log.d("YouTubeProjects", "Favorites데이터 : ${youtubeItems}")
}
}
HomeResult()
}
override fun onFailure(call: Call<FavoritesData?>, t: Throwable) {
Log.e("YouTubeProjects", "에러 : ${t.message}")
}
})
1. 우선 정상적으로 서버에서 데이터를 가져오는지 로그를 찍어 보았는데 위와 같이 너무 잘 찍힌다.(데이터로드 확인)
▼ Adapter ▼
inner class FavoritesViewHolder(private val binding: FavoritesitemsBinding) : RecyclerView
.ViewHolder(binding.root){
fun bind(item:YoutubeModel){
binding.apply {
Log.d("YouTubeProjects", "어댑터 데이터 : ${item.url}")
homeTitle.text = item.title
Glide.with(context)
.load(item.url)
.into(homeUrl)
}
}
}
2. 다음으로 뷰자체가 아무것도 안나와서 어댑터가 인식을 못하는건지 로그를 찍어봤는데 왠열, 로그자체가 안찍힌다.(데이터를 못받아오는것 확인)
▼ Adapter ▼
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
Log.d("YouTubeProjects", "onCreateViewHolder 호출되냐?")
val binding =FavoritesitemsBinding.inflate(LayoutInflater.from(parent.context),parent,false)
return FavoritesViewHolder(binding)
}
3. 혹시 몰라서 어댑터 자체가 호출안되는지 확인해보기위해 onCreateViewHolder에 로그를 찍어봤는데 호출자체가 안되었다.(어댑터 자체를 호출하지 않는것을 확인)
▼ Fragment ▼
homeViewModel.homeResult.observe(viewLifecycleOwner){
Log.d("YouTubeProjects", "프래그먼트 데이터 : ${it}")
if(adapter !=null){
Log.d("YouTubeProjects", "어댑터 정상작동?")
adapter.items.addAll(it)
Log.d("YouTubeProjects", "adapter.items에 뭐가 찍혀있는데?${adapter.items}")
adapter.notifyDataSetChanged()
} else Log.d("YouTubeProjects", "어댑터 널값?")
}
4. 어댑터가 호출되지 않는것을 보고 어댑터의 초기화가 재대로 되지않았는지 확인해보려고 로그를 찍어봤는데, 얘는 또 너무 잘 찍힌다. (데이터, 어댑터모두 정상적으로 초기화되고 데이터를 받아오고 있지만 어댑터는 호출하지않음)
▼ Fragment ▼
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View{
setupView()
setupListeners()
return binding.root
}
5. 혹시나 onCreateView의 return값이 잘못되었나 봤지만 정상적으로 써져있었다.
▼ Fragment ▼
6. 잘보면 1번 adapter를 HomeFragmentAdapter(requireContext())로 초기화했는데 맨 밑줄 adapter에 1번adapter를 넣어줘야되는데 2번어댑터와 1번어댑터가 서로 관련이 없어서 homeRecyclerView가 HomeFragmentAdapter를 인식못해서 어댑터를 호출못하고 결국 앱에 표시할 수 없었던거였다.
결론
변수명을 바꿔주니 서로 인식되어 정상적으로 데이터 출력이 되었고, 로그도 정상적으로 찍혔다.
귀찮다고 변수명을 대충 쓰지말고 규칙을 정해서 잘 써봐야겠다.
썸네일 출처
'TIL, WIL(일기)' 카테고리의 다른 글
231019 (4)구글로그인 연동하기(저장 : Realtime Database) (0) | 2023.10.19 |
---|---|
231015 (1)구글로그인 연동하기(SHA-1인증서) (0) | 2023.10.16 |
230922 시간 문자열 형식 변경 (0) | 2023.09.22 |
230920 Retrofit데이터 클래스 정의 (0) | 2023.09.20 |
230919 SearchView 억까 (0) | 2023.09.19 |