如何在自定义View里使用ViewModel

本文介绍了如何在自定义View中使用ViewModel,包括实现ViewModelStoreOwner接口和使用ViewTreeViewModelStoreOwner。通过实例展示了两种方法的优缺点,强调了在使用过程中需要注意的生命周期问题,以避免空指针异常。
摘要由CSDN通过智能技术生成

前言

ViewModel只能在Activty和Fragment里使用吗,能不能在View里使用呢?

假如我要提供一个View,它包含一堆数据和状态,比如一个新闻列表、时刻表等。我是否可以再这个这个自定义View里使用ViewModel去管理数据呢?

在View中使用ViewModel

答案是肯定的!那么我们说干就干,看看到底怎么使用。

为了确保与宿主Avtivity/Fragment发生管理和便于宿主管理,我们需要使用ViewModelProvider去创建ViewModel,典型的使用方法如下:

ViewModelProvider(this,).get(CustomModel::class.java)

但这时就遇到了麻烦,ViewModelStoreOwner 去哪里弄,不仅没有ViewModelStoreOwner ,也没有ViewModelStore啊。当然,你也可以打破规则,什么都不管,直接创建ViewModel,但是我并不建议你这么做。这里我讲解一下如何老老实实的按照“规则”去使用它。

首先要获取到ViewModelStoreOwner ,有两种方法:

  1. 在你自定义View中实现它,并按照ComponentActivity的逻辑实现一遍;
  2. 使用承载你自定义View的Activity或者Fragment的ViewModelStoreOwner

在开始使用ViewModel之前,我们先准备一个自定义View,就弄一个简单的组合View:

class CustomView : RelativeLayout {

    constructor(context: Context) : super(context) {
        initView(context)
    }

    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
        initView(context)
    }

    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
        initView(context)
    }

    private fun initView(context: Context) {
        mViewModelStore = ViewModelStore()
        LayoutInflater.from(context).inflate(R.layout.custom_layout, this, true)
    }

}

布局文件:

<RelativeLayout
    android:gravity="center"
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        and
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值