您当前的位置: 首页 > 

梁同学与Android

暂无认证

  • 7浏览

    0关注

    618博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Andriod --- JetPack :DataBinding + LiveData +ViewModel 简单实例

梁同学与Android 发布时间:2022-03-14 15:49:44 ,浏览量:7

Andriod — JetPack :初识 JetPack

Andriod — JetPack :LifeCycle 的诞生

Andriod — JetPack :ViewModel 的诞生

Andriod — JetPack :BaseObservable 与 ObservableField 双向绑定

Andriod — JetPack :DataBinding + LiveData +ViewModel 简单实例

Andriod — JetPack :Room 增删改查

Andriod — JetPack :Room + ViewModel + LiveData 增删改查实例

Andriod — JetPack :LiveData setValue 和 postValue 的区别

一、DataBinding

1.让布局页面承担了部分原本属于页面的工作,是页面文件和布局耦合度进一步降低。页面文件:Activity。布局:activity_main.xml

2.减少了很多 findViewById 与 OnClickListener 布局文件可以包含一些简单的业务逻辑 在这里插入图片描述

二、LiveData

在 ViewModel 中的数据发生变化时通知页面 在这里插入图片描述LiveData 与 ObservableField 同样可以实现双向绑定 这里的 Model 层下面的例子未呈现,等过后学到了 JetPack - Room 自然就懂了

三、ViewModel

1.它是介于 View(视图)和 Model(数据模型)直接的桥梁 2.使视图和数据能够分离,也能够保持通信 https://blog.csdn.net/qq_43290288/article/details/123478346

四:DataBinding + LiveData +ViewModel 实例

在 build.gradle 中添加 DataBinding 支持

android {
    dataBinding {
        enabled = true
    }
}

自定义MyViewModel.java

import android.view.View;

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class MyViewModel extends ViewModel {
    private MutableLiveData aTeamScore;
    private MutableLiveData bTeamScore;

    public MutableLiveData getaTeamScore() {
        if(aTeamScore == null) {
            aTeamScore = new MutableLiveData();
            aTeamScore.setValue(0);
        }
        return aTeamScore;
    }
    public MutableLiveData getbTeamScore() {
        if(bTeamScore == null) {
            bTeamScore = new MutableLiveData();
            bTeamScore.setValue(0);
        }
        return bTeamScore;
    }
    public void aTeamAdd(View view) {
        aTeamScore.setValue(aTeamScore.getValue() + 1);
    }
    public void bTeamAdd() {
        bTeamScore.setValue(bTeamScore.getValue() + 1);
    }
}

MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;

import android.database.DatabaseUtils;
import android.os.Bundle;

import com.example.mvvm20220312.databinding.ActivityMainBinding;
import com.example.mvvm20220312.viewmodel.MyViewModel;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); // ActivityMainBinding 对应 activity_main.xml
        MyViewModel viewModel  = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyViewModel.class);
        binding.setViewModel(viewModel); // DataBinding 与 ViewModel 绑定
        binding.setLifecycleOwner(this); // 要想在绑定类中使用 LiveData 对象,我们需要指定生命周期所有者来定义 LiveData 对象的范围。在绑定类实例化后指定 activity 作为生命周期所有者
    }
 }

activity_main.xml



    
    
        
    

    

        

        

        

        
    

在这里插入图片描述

五、Fragment 与MVVM的使用

在使用MVVM模式时,Fragment可以作为视图(View)的一部分来展示数据和处理用户交互。下面是一种在Fragment中使用MVVM的方法:

创建模型(Model):与上述提到的模型相同,定义数据类或业务逻辑类。

创建视图模型(ViewModel):继承自Android中的ViewModel类,负责处理数据和业务逻辑。

java

public class MyViewModel extends ViewModel { private MutableLiveData data = new MutableLiveData();

public void setData(String newData) {
    data.setValue(newData);
}

public LiveData getData() {
    return data;
}

}

创建Fragment:作为视图(View)的一部分,负责展示数据和处理用户交互。

java

public class MyFragment extends Fragment { private MyViewModel viewModel;

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

    viewModel = new ViewModelProvider(this).get(MyViewModel.class);
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    // 创建和设置视图

    // 使用数据绑定将viewModel与视图绑定
    FragmentMyBinding binding = FragmentMyBinding.inflate(inflater, container, false);
    binding.setLifecycleOwner(this);
    binding.setViewModel(viewModel);

    return binding.getRoot();
}

}

XML布局文件中使用数据绑定:通过@{}来绑定视图与视图模型中的数据和命令。

xml


    

    

在上述代码中,我们创建了一个视图模型MyViewModel,它具有setData()方法来更新数据和getData()方法供视图获取数据。然后,在Fragment的onCreateView()方法中,我们使用数据绑定将视图模型与布局文件进行绑定。

这样,当视图模型中的数据发生变化时,布局文件中对应的数据也会自动更新,从而保持视图与数据的同步。

通过使用MVVM模式和数据绑定,我们能够更好地分离视图与业务逻辑,并提高代码的可测试性和重用性。同时,使用Fragment作为视图的一部分,能够更方便地管理用户交互和界面切换。

关注
打赏
1660730345
查看更多评论
立即登录/注册

微信扫码登录

0.0364s