我是靠谱客的博主 稳重豌豆,最近开发中收集的这篇文章主要介绍ViewModel学习,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前置LiveData学习

没有使用viewModel之前,LiveData数据和逻辑的处理都放在activity里面,代码逻辑不清晰

现在将LiveData数据和逻辑处理放在ViewModel中,可以减少activity的代码,是的结构更加清晰

并且在屏幕旋转等配置更改是,数据不会丢失,还可在activity和fragment之间进行共享数据

案例一重构:将数据和逻辑放到ViewModel里面

创建ViewModel类

public class ViewModel1 extends ViewModel {

    //存放数据
    public MutableLiveData<Integer> mClickCount = new MutableLiveData<>(0);

    /**
     * 处理逻辑
     */
    public void addClick() {
        //点击数字增加
        Integer value = mClickCount.getValue();
        //点击一下,增加数字
        mClickCount.setValue(value+10);
    }
}

修改activity代码

        //创建viewModel需要使用ViewModelProvider
        ViewModelProvider provider = new ViewModelProvider(this);
        //创建ViewModel
        ViewModel1 viewModel1 = provider.get(ViewModel1.class);



        count = findViewById(R.id.tv_count);
        findViewById(R.id.btn_click).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //现在就是viewModel处理逻辑,不在activity里面处理
                viewModel1.addClick();
            }
        });

        //观察这个LiveData,当LiveData里面的值变化了,就会收到onChanged的回调
        viewModel1.mClickCount.observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                count.setText("点击的次数:" + integer);
            }
        });

案例二扩展:修改为在2个fragment中共享数据

创建ViewModel类

public class ViewModel2 extends ViewModel {

    public MutableLiveData<String> mText = new MutableLiveData<>("");


    public void setText(String text) {
        mText.setValue(text);
    }
}

修改xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <fragment
        android:id="@+id/fragment1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        class="com.chengzis.databingtest.ViewModel.Fragment1"/>

    <fragment
        android:id="@+id/fragment2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        class="com.chengzis.databingtest.ViewModel.Fragment2"/>
</LinearLayout>

修改Activity,删除无用代码

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_viewmodel3);
    }

创建fragment

public class Fragment1 extends Fragment {
    public Fragment1() {
        super(R.layout.fragment1);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        //创建provider的ViewModelStoreOwner修改为使用activity的,这样多个fragment就可以使用同一个ViewModel
        ViewModelProvider provider = new ViewModelProvider(getActivity());
        ViewModel2 viewModel2 = provider.get(ViewModel2.class);
        Log.i("Fragmenttest", "1111  viewmodel = " + viewModel2);

        TextView etText = view.findViewById(R.id.et_text);
        etText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                viewModel2.setText(s.toString());
            }
        });
    }
}

 

public class Fragment2 extends Fragment {
    public Fragment2() {
        super(R.layout.fragment2);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);


        ViewModelProvider provider = new ViewModelProvider(getActivity());
        ViewModel2 viewModel2 = provider.get(ViewModel2.class);

        Log.i("Fragmenttest", "2222  viewmodel = " + viewModel2);

        TextView tvText = view.findViewById(R.id.tv_text);
        viewModel2.mText.observe(getViewLifecycleOwner(), new Observer<String>() {
            @Override
            public void onChanged(String s) {
                tvText.setText(s);
            }
        });
    }
}

最后

以上就是稳重豌豆为你收集整理的ViewModel学习的全部内容,希望文章能够帮你解决ViewModel学习所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部