【发布时间】:2021-06-30 09:14:15
【问题描述】:
我需要从片段内的参数中获取参数并将其提供给视图模型,以便它根据它过滤列表或不过滤。我认为可以将此参数传递给视图模型的工厂,然后从那里传递给视图模型本身的构造函数,因此它将具有 val onlyFavorites 并且可以立即在 init 块中使用。
ContentFragment.kt
class ContentFragment : Fragment(), ItemFavoriteClickListener {
private val viewModel: ContentViewModel by viewModels(factoryProducer = {
ContentViewModel.Factory()
})
private var adapter: MyItemModelsAdapter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.getBoolean("onlyFavorites", false)
viewModel.items.observe(this) {
adapter?.items = it
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recyclerView?.layoutManager = LinearLayoutManager(context)
adapter = MyItemModelsAdapter(this)
recyclerView?.adapter = adapter
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_favourites, container, false)
}
override fun onFavoriteClick(item: ItemModel, isFavorite: Boolean) {
viewModel.changeFavoriteState(item, isFavorite)
}
companion object {
fun newInstance(onlyFavorites: Boolean): ContentFragment {
val contentFragment = ContentFragment()
val args = Bundle()
args.putBoolean("onlyFavorites", onlyFavorites)
contentFragment.arguments = args
return contentFragment
}
}
}
ContentViewModel.kt
class ContentViewModel(
private val repository: MyItemsRepository
) : ViewModel() {
class Factory : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return ContentViewModel(MyItemsRepositoryImpl.getInstance()) as T
}
}
private val _items: MutableLiveData<List<ItemModel>> = MutableLiveData()
val items: LiveData<List<ItemModel>>
get() = _items
fun changeFavoriteState(item: ItemModel, favorite: Boolean) {
repository.setFavorite(item, favorite)
}
init {
_items.value = repository.items.filter { it.isFavorite }
repository.addItemChangeListener {
_items.value = repository.items.filter { it.isFavorite }
}
}
}
我需要您的帮助来编写代码。我心里明白怎么做,但我不知道怎么写。非常感谢您提供带有解释的书面示例。
【问题讨论】:
标签: android kotlin viewmodel factory