当前位置:网站首页>ViewModel 初体验

ViewModel 初体验

2022-07-04 12:51:00 菜鸟xiaowang

ViewModel旨在以生命周期意识的方式存储和管理用户界面相关的数据,它可以用来管理Activity和Fragment中的数据.还可以拿来处理Fragment与Fragment之间的通信等等.

基本使用 

1.导入依赖

implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"

2.创建实体对象

public class User implements Serializable {
    String name;
    int age;

    public User(String name,int age){
        this.name = name;
        this.age = age;
    }
}

3.创建 userModel 数据模型

public class UserModel extends ViewModel {
    public MutableLiveData<User> mLiveData = new MutableLiveData<>();

    public UserModel(){
        //初始值
        mLiveData.postValue(new User("wang",20));
    }

    //更新操作
    public void doSomething(){
        User user = mLiveData.getValue();
        user.name = "重新设置的数据";
        mLiveData.setValue(user);
    }
}

4.activity引用

        UserModel userModel = ViewModelProviders.of(this).get(UserModel.class);
        userModel.mLiveData.observe(this, new Observer<User>() {
            @Override
            public void onChanged(User user) {
                mMain2Binding.name.setText(user.name);
            }
        });
 public void onClick(View view) {
        switch (view.getId()) {
            case R.id.updateUser:
                userModel.doSomething();
                Log.e("tag","onclick");
                break;
        }
    }

5. ViewModel妙用

1: Activity与Fragment"通信"


有了ViewModel,Activity与Fragment可以共享一个ViewModel,因为Fragment是依附在Activity上的,在实例化ViewModel时将该Activity传入ViewModelProviders,它会给你一个该Activity已创建好了的ViewModel,这个Fragment可以方便的访问该ViewModel中的数据.在Activity中修改userModel数据后,该Fragment就能拿到更新后的数据.

public class MyFragment extends Fragment {
     public void onStart() {
        //这里拿到的ViewModel实例,其实是和Activity中创建的是一个实例
         UserModel userModel = ViewModelProviders.of(getActivity()).get(UserModel.class);
     }
 }


2: Fragment与Fragment"通信"


下面我们来看一个例子(Google官方例子)

public class SharedViewModel extends ViewModel {
    private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

    public void select(Item item) {
        selected.setValue(item);
    }

    public LiveData<Item> getSelected() {
        return selected;
    }
}


public class MasterFragment extends Fragment {
    private SharedViewModel model;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        itemSelector.setOnClickListener(item -> {
            model.select(item);
        });
    }
}

public class DetailFragment extends Fragment {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        model.getSelected().observe(this, { item ->
           // Update the UI.
        });
    }
}

首先定义一个ViewModel,在里面放点数据,然后在MasterFragment和DetailFragment都可以拿到该ViewModel,拿到了该ViewModel就可以拿到里面的数据了,相当于间接通过ViewModel通信了

原网站

版权声明
本文为[菜鸟xiaowang]所创,转载请带上原文链接,感谢
https://blog.csdn.net/xiaowang_lj/article/details/125586280

随机推荐