概述
前置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学习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复