개발노트/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
    }