基于传递给片段的参数,具有相同ViewType类型的相同片段类型的多个实例

问题描述 投票:0回答:1

我有ViewPager2的应用程序。其中的所有页面都是相同类型的实例。所有页面都在recyclerview中显示一些不同数据类型的列表。使用Retrofit调用从某些API端点填充数据。

我正在使用匕首2注入视图模型。

一页都工作正常。现在,我想创建其他页面,并问是否有任何方法/模式来实现其他页面而无需创建不同的片段类,而仅使用不同的viewModel类型?

也许是一些通用的viewModel之类的。

android retrofit dagger-2 android-viewmodel android-viewpager2
1个回答
0
投票

PageType

enum class PageType {
    Page1, Page2, Page3;
}

val PageType.viewModelClass: KClass<out GenericViewModel>
    get() = when (this) {
        PageType.Page1 -> Page1ViewModel::class
        // todo
    }

ViewModel

abstract class GenericViewModel<T>() : BaseViewModel() {

    abstract val pageType: PageType
}

class Page1ViewModel @Inject constructor() : GenericViewModel() {
    override val pageType: PageType = PageType.Page1
}

片段

class PageFragment : BaseFragment() {

    private val pageType: PageType by lazy {
        TODO("read from arguments bundle")
    }

    private val vm: GenericViewModel by lazy {
        ViewModelProvider(this, viewModelFactory).get(pageType.viewModelClass.java)
    }

    companion object {
        fun newInstance(type: PageType): PageFragment {
            TODO("add type into bundle and set as arguments")
        }
    }
}

如果您当前的匕首设置适用于视图模型,则无需执行任何特殊操作即可支持此模式。

© www.soinside.com 2019 - 2024. All rights reserved.