개발노트/android
ViewModel,Repository
시계속세상은아직돌아가는중
2024. 1. 16. 16:38
1) ViewModel
class ViewModel(
private val repository: HomeRepository
) : ViewModel() {
}
2) Factory 패턴
class ViewModelFactory(
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(HomeViewModel::class.java)) {
return HomeViewModel(
HomeRepositoryImpl(RetrofitClient)
) as T
} else {
throw IllegalArgumentException("Not found ViewModel class.")
}
}
}
3) 연결
3-1) 액티비티
private lateinit var viewModel: TemplateViewModel
private fun initViewModel() {
viewModel = ViewModelProvider(
this,
TemplateViewModelFactory(this@TemplateActivity)
)[TemplateViewModel::class.java]
with(viewModel) {
liveType.observe(this@TemplateActivity, Observer { it ->
if (it != null) {
Log.d("타입", it.name)
saveType(it)
}
})
}
}
3-2) Fragment
private val viewModel by lazy {
ViewModelProvider(
this,
TagViewModelFactory(requireActivity())
)[TagViewModel::class.java]
}
private fun initViewModel() {
with(viewModel) {
categoryList.observe(viewLifecycleOwner) {
if (it != null) {
videoAdapter.submitList(it.toList())
Log.d("리스폰", categoryList.value.toString())
if (it.toList().size == 10) {
binding.homeRvVideoList.scrollToPosition(0)
}
}
}
pageToken.observe(viewLifecycleOwner) {
if (it != null) {
Log.d("토큰", pageToken.value.toString())
//호출 횟수 테스트용 observe
}
}
btnList.observe(viewLifecycleOwner) {
if (it != null) {
btnsAdapter.submitList(it)
Log.d("버튼.뷰모델.리스트", it.toString())
}
}
event.observe(viewLifecycleOwner) { event ->
when (event) {
is HomeClickEvent.OpenDetail -> {
Intent(requireContext(), DetailActivity::class.java).apply {
putExtra(DetailActivity.EXTRA_DATA, event.item)
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}.run { requireContext().startActivity(this) }
}
}
}
}
}
4) repository 패턴
4-1) 인터페이스
interface HomeRepository {
suspend fun getPopularVideo(
token: String?,
category: String?
): Pair<List<PlayListModel>, String>
suspend fun getCategory(): List<ButtonModel>?
}
4-2) 구현부
override suspend fun getCategory(): List<ButtonModel> {
val responseCategory = client.api.getCategory()
Log.d("카테고리", responseCategory.items.toString())
val responseList = responseCategory.items ?: return emptyList()
val resultList: List<ButtonModel> =
responseList
.filter { categoryItems ->
categoryItems.snippet.assignable &&
categoryItems.id != "19" &&
categoryItems.id != "27"
}
.map { categoryItems ->
ButtonModel(
category = categoryItems.id,
btnTitle = categoryItems.snippet.title ?: "오류"
)
}
// 여행하고 교육이 404 에러가 남(카테고리 19,27)
Log.d("버튼.리스트", resultList.toString())
return resultList
}