Android从零开始搭建MVVM架构(1)
**《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】**
那么在Activity设置数据和设置点击事件(意思设置了variable标签后DataBinding会自动生成get和set方法。studio3.5后只要xml写上,IDE会自动生成,低版本可能需要Make Project下)。如下就实现了一个设置数据,和设置点击事件。
通过以下代码可以看到,只要绑定下布局,通过Binding对象,可以做任何事。从此不再使用findViewById,亦或是butterKnife。
public class BaseUseActivity extends AppCompatActivity implements View.OnClickListener {
private ActivityBaseuseBinding baseuseBinding;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_baseuse);
baseuseBinding = DataBindingUtil.setContentView(this, R.layout.activity_baseuse);
baseuseBinding.setTextStr(“这里就能设置数据”);
baseuseBinding.setOnClickListener(this);
}
@Override
public void onClick(View v) {
baseuseBinding.txt.setText(“点击设置的数据”);
}
}
这里还能调用类里的方法,且需要特别注意,在使用DataBinding的时候,包名一定是小写,不然找不到包名,假设我们这里定义个类,然后调用类里的方法。
public class OnClickUtil {
public void onClickWithMe(View view) {
Toast.makeText(view.getContext(), “调用类里的方法”, Toast.LENGTH_SHORT).show();
}
}
其他步骤都一样,唯一不同的是,调用类里方法的写法不同。假设button点击调用。用::表示调用,后面接的是方法名。
<Button
…
android:onClick=“@{onClickUtil::onClickWithMe}”
/>
1.2、和别名alias的使用
这里我们先定义同名的2个类User。放在不同包里。
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
之前我们的标签就可以用。
的用法是在同一个xml里需要用到多次User的时候,type类型只需要写的类名就可以代表了,就不需要总是写包名.类型。但这个时候也就出现2个同名不同包的类是需要用到alias别名,不然类名重复了。
Activity里的使用都是非常简单的,如果有不明白,稍后放出链接。
这里还有特殊功能,比如我们再布局预览页面。通常会使用 **tools:text=“中间的”**来预览布局,这个时候可以通过
使用default的时候,即使是studio3.5里,也不提示,不过不影响。还有一点,在DataBinding里,已经处理了null。所以这个时候你在Activity里给user设置为null。也不会崩溃
二、DataBinding在Fragment和RecyclerView里的使用
在Fragment的使用和Activity里的使用一样。获取根目录的方式如下。
//注意获取根布局是
View view = activityAlisBinding.getRoot();
这里重点介绍下再recyclerView里的用法。我们以前是不是写ViewHolder写的烦了?用上了DataBinding后,这么告诉你一个ViewHolder就能搞定一切需要的ViewHolder
先看下我们的唯一的ViewHolder。首先提下,自动生成的Binding的父类都是ViewDataBinding。我是把ViewHolder单独拉出来了。这样大家都能用:
public class NewViewHolder extends RecyclerView.ViewHolder {
public ViewDataBinding binding;
public NewViewHolder(ViewDataBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}
在Adapter里只需要职业
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
ItemNewOrderBinding binding = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), R.layout.item_new_order, viewGroup, false);
return new NewViewHolder(binding);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
NewViewHolder newViewHolder = (NewViewHolder) viewHolder;
//如果是多布局,那么对binding进行一个 instansof的一个判断就好。这样我们的ViewHolder永远只需要一个
ItemNewOrderBinding binding = (ItemNewOrderBinding) newViewHolder.binding;
binding.txtName.setText(“这样就能使用了!!”);
}
三、单向数据绑定
单向绑定可以理解为,改变了bean对象里的数据,就会自动改变我们xml的显示。这里涉及到3个类: BaseObservable、ObservableField、ObservableCollection。看这个名字就知道有点类似观察者模式
3.1、BaseObservable
首先我们定义个以Dog类
public class Dog extends BaseObservable {
//如果是public修饰的,直接用@Bindable
@Bindable
public String name;
//如果是private修饰的,则在get方法使用@Bindable
private String color;
public void setDataOnlyName(String name, String color) {
this.name = name;
this.color = color;
//只刷name字段
notifyPropertyChanged(com.lihang.databindinglover.BR.name);
}
public void setDataAll(String name, String color) {
this.name = name;
this.color = color;
//刷新全部字段
notifyChange();
}
…//省略部分代码
}
这里我同事改变了name和color的颜色,说明
- bean对象需要继承 BaseObservable
- @Bindable 标注用来表示哪个字段需要单向绑定。public修饰的可以直接用@Bindable绑定。private修饰的需要在get()方法上用@Bindable标注
- notifyChange();刷新所有字段,notifyPropertyChanged(com.lihang.databindinglover.BR.name);刷新单个字段。注意这里说的刷新全是被@Bindable绑定的。如果BR.name出不来。建议build下项目
- 还有不明白的可以在末尾链接demo看:单向数据绑定 – BaseObservable.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Io4eoZ00-1651036158269)(https://user-gold-cdn.xitu.io/2019/9/26/16d6b8c92e5b5e33?imageslim)]
继承了BaseObservable的bean对象,还可以监听刷新了哪
dog.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
@Override
public void onPropertyChanged(Observable sender, int propertyId) {
if (propertyId == com.lihang.databindinglover.BR.name) {
Log.e(“看看刷新了哪”, “刷新了name”);
} else if (propertyId == com.lihang.databindinglover.BR._all) {
Log.e(“看看刷新了哪”, “全部全部”);
} else {
Log.e(“看看刷新了哪”, “未知错误~”);
}
}
});
3.2、ObservableField
其实这个ObservableField就是对BaseObservable的简化,不用继承,不用主动调刷新代码。
这个时候我们顶一个Human类
public class Human {
//这里必须是常量,ObservableField<参数类型>
//其实写上了下面一句,就是BaseObservable,set,get, @Bindable,刷新都封装了。直接看构造方法
public final ObservableField name = new ObservableField<>();
//其中也封装了基本数据类型:ObservableInt等
public final ObservableInt age = new ObservableInt();
public Human(String name,int age){
this.name.set(name);
this.age.set(age);
}
}
Activity和xml里的操作和之前的一样,改变数据,自动改变xml只需要:
//简直太方便了吧
human.name.set(“玉玑子”);
human.age.set(15);
3.3、ObservableCollection
一看就是集合,这里和我们常用的 List Map一样。只不过这里的ObservableList、ObservableMap是封装好的。当我们改变集合里的数据时。xml也会改变。唯一要注意的是,在xml里引用这些集合的时候<类型>,这些符号,会影响xml格式所以要转义。用< 代表<;用>代表>(这些转义符,同样支持Mark Down);想了解更多可自行百度 DataBinding转义符。
这里遇到一个坑,就是你的default = “默认值” 这个默认值最好不是data里的引用。不然会报错哦。这里我们带入index = 0 带入,把key = name。代入,然后动态改变,集合里这2个值:
@Override
public void onClick(View v) {
int randowInt = new Random().nextInt(100);
switch (v.getId()){
case R.id.btn_index:
//改变list的第一项
list.add(0,“list的值” + randowInt);
break;
case R.id.btn_key:
map.put(“name”,“map的值” + randowInt);
break;
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fUfZgS2X-1651036158270)(https://user-gold-cdn.xitu.io/2019/9/26/16d6c70ee17e1648?imageslim)]
四、双向数据绑定
意思就是你改变bean对象里的值,他会主动改变xml的显示,改变xml的里的值,他会把bean对象里的属性改变了。 这里我们用1个TextView显示数据;用1个EditTextView绑定bean对象,再用1个Button可以动态查询bean对象里的属性值
ndroid">
Android从零开始搭建MVVM架构(1)相关推荐
- Android从零开始搭建MVVM架构(1)————DataBinding
在真正接触并使用MVVM架构的时候,整个人都不好了.因为个人觉得,MVVM相对于MVC.MVP学习难度比较大,设计的知识点不是一点半点.所以想慢慢记录下自己的成长.如有错误希望指正. 从零开始搭建MV ...
- Android从零开始搭建MVVM架构(3)——ViewModel
ViewModel类是被设计用来以可感知生命周期的方式存储和管理 UI 相关数据,ViewModel中数据会一直存活即使 activity configuration发生变化. ViewModel有什 ...
- Android从零开始搭建MVVM架构(1),kotlin扩展函数原理
使用default的时候,即使是studio3.5里,也不提示,不过不影响.还有一点,在DataBinding里,已经处理了null.所以这个时候你在Activity里给user设置为null.也不会 ...
- Android从零开始搭建MVVM架构(1),企业级项目实战讲解
type="com.lihang.databindinglover.User"/> Activity里的使用都是非常简单的,如果有不明白,稍后放出链接. 这里还有特殊功能,比 ...
- Android从零开始搭建MVVM架构(4,android面试基础题记不住
前言 九月裸辞从长沙跑到上海,跑了一个月的面试,本月中旬终于拿到了爱奇艺的高级工程师offer. 做Android开发整4年有余,但是这一年才是最充实的,我花一年时间努力,送给了自己一个完美的蜕变! ...
- python从零开始搭建fdtd架构-1原理
python从零开始搭建fdtd架构-1原理 本系列文章从零开始用python搭建时域有限差分算法的架构,具有网格设置.边界条件设置.光源设置.监视器设置.多种图形设置等功能.能够仿真出二维光栅或者三 ...
- Android中的MVVM架构设计-实用篇(五)实现RecyclerView列表展示
巨齿鲨.png 引言 上一篇中我们使用mvvm模式进行了listview的展示,当然我的方式只是众多方式中的比较简单的一种,大家如果有其他写法方式,希望不吝赐教,在下在此谢过. 今天给大家讲解一下Re ...
- Android MVVM 架构应用实现
以前项目中虽然也使用MVVM架构,但由于整体框架不是我自己搭建的,导致我对于MVVM架构的整体还是很不熟悉,所以这次就自己搭建并实现一次MVVM架构. MVVM架构使用的组件有ViewModel.Li ...
- 安卓实战之如何快速搭建app架构
前言 最近公司的另一个项目又要立项了,作为公司的唯一安卓工程师任务来了(新来的移动端的老大说项目还是主要你负责,我就负责帮你们安排下进度),听了这话我是伤心的在这公司不管是几个还是1个安卓开发都是我来 ...
最新文章
- Mybatis复习笔记:4
- 【c++】指针参数是如何传递内存的
- HashMap面试深入详解jdk1.8
- 两个列表之间移动数据
- 10.Facade-外观模式
- 基于mysqld_multi实现MySQL 5.7.24多实例多进程配置
- 【转】简单的java缓存实现
- NB-IOT终端技术新突破 中兴微电子加快IoT布局
- pythontry参数_Python ——Try Except
- 测绘技术设计规定最新版_测绘技术设计规定
- python写字板_pywinauto简单操作写字板的例子
- php 收缩栏,HTML5每日一练之details展开收缩标签的应用
- 编程行业高手级别必学C语言,要挣大钱必学C语言,要做黑客、红客必学C语言,要面试名企、外企、高薪职位必学C语言。
- Chrome firefox ie等浏览器空格(nbsp;)兼容问题
- Python爬虫编程实践Task 01
- 不支持给定路径的格式_剑指offer_12_矩阵中的路径
- redis 经典36问
- codebook码本算法
- linux和docker的capabilities介绍
- 智慧门户、信创门户、国产门户、数字化门户,如何构建出七大特色亮点?