摘要:本文将带你了解Android应用开发Android MVVM架构模式DataBinding框架解析,希望本文对大家学Android有所帮助。
本文将带你了解Android应用开发Android MVVM架构模式DataBinding框架解析,希望本文对大家学Android有所帮助。
Android MVVM架构模式DataBinding框架解析。
一 表达式
支持的表达式:
数学计算 + - / * %
字符串连接 +
逻辑 && ||
二进制 & | ^
一元运算符 + - ! ~
位移 >> >>> <<
比较 == > < >= <=
instanceof
组 ()
文字 - 字符,字符串,数字, null
类型转换
函数调用
字段存取
数组存取 []
三目运算符 ?:
如:
数组存取 []
?
1
2
3
<variable name="list" type="List<String>">
<variable name="index" type="int">
android:text="@{list[index]}"</variable></variable>
三目运算符 ?:
?
1
android:visibility="@{id>5 ? View.GONE : View.VISIBLE}"
资源引用:
?
1
2
@{@string/name}
@{@drawable/fengjing1}
不支持的表达式:
this
super
new
二 数组使用
这里的实例是RecyclerView中的每个Item,有9张图,然后让这9张图Biding
1 创建variable
?
1
2
3
<variable name="position" type="int">
<variable name="ninePictureArray" type="String[][]"></variable></variable>
2 ImageView中引用
?
1
2
3
app:imageUrl="@{ninePictureArray[position][0]}"
app:imageUrl="@{ninePictureArray[position][1]}"
...
position是第几个Item的标记,后面的数字是第几张图片
3 再用binding去set值
这里是在Adapter中
?
1
2
3
4
5
void bindItem(final int bindPosition{
mItemLayoutBinding.setItemViewModel(aItemViewModel);
mItemLayoutBinding.setNinePictureArray(mPicture);// 这里传入的是二维数组
mItemLayoutBinding.setPosition(bindPosition);
}
传入二维数组mPicture和int的position的值(这里通过形参获取)
这样XML的二维数组ninePictureArray就有了值,再在各个ImageView中去取不同位置的值
三 DataBinding结合RecyclerView
首先
MAinActivity(也就是有RecyclerView)的地方
?
1
2
3
4
//改写 setContentView 进行MainActivity和activity_main的连接
ActivityMainBinding activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
//通过ID去绑定XML的组件
mRecyclerView = activityMainBinding.recyclerView;
再去ViewModel中加载数据
?
1
itemViewModel2.initData(MainActivity.this);
加载布局管理器
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 加载布局管理器
initView();
private void initView() {
mLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
//设置布局管理器
mRecyclerView.setLayoutManager(mLayoutManager);
//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
mRecyclerView.setHasFixedSize(true);
//设置adapter
mRecyclerView.setAdapter(itemViewModel2.mAdapter);
//添加分割线
mRecyclerView.addItemDecoration(new ItemDivideLineView(
this, DividerItemDecoration.VERTICAL));
}
在Adpater中:
1 根据XML的名字编译过后的Databinding 见上方有讲解 创建对象
在onCreateViewHolder中:
?
1
2
3
4
5
6
// 传入itemViewModel给MyComponent
// MyComponent.getObject3(aItemViewModel);
// 这里还使用了ImageView 所以传入参数给 new MyComponent()
// 若只使用RecyclerView不使用ImageView,后面的newMyComponent() 可以删掉
ItemLayoutBinding itemLayoutBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_layout,parent, false,new MyComponent());
return new ViewHolder(itemLayoutBinding);
2 onBindViewHolder中
?
1
2
// 传过来的ArrayList 根据position绑定值 position为当前界面显示的item条目 从0开始 若有多个则调用多个 但是也是一个个按先后顺序的
holder.bindItem(position);
3 在ViewHolder class中:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//声明:
ItemLayoutBinding mItemLayoutBinding;
public ViewHolder(ItemLayoutBinding itemLayoutBinding) {
super(itemLayoutBinding.itemLayout);
this.mItemLayoutBinding = itemLayoutBinding;
}
void bindItem(final int bindPosition){
// 不是创建新的itemViewModel
//ItemViewModel itemViewModel = new ItemViewModel();
aItemViewModel.setOtherPosition(bindPosition);
mItemLayoutBinding.setItemViewModel(aItemViewModel);
mItemLayoutBinding.setNinePictureArray(mPicture);
mItemLayoutBinding.setPosition(bindPosition);
}
}
四 DataBinding使用ImageView加载网络图片(这里是RecyclerView中的ImageView)
XML中:
?
1
2
3
4
// valiable 中
<variable name="user" type="包名.User类(Bean类)">
//ImageView中
app:imageUrl="@{ user.UserImage}"</variable>
会调用方法getUserImage()
java中:
?
1
2
3
4
public URL getUserImage() throws MalformedURLException {
URL url = new URL(String类型的url);
return url;
}
但是会出现一个问题,就是不识别app:的属性
app:imageUrl=”@{ user.UserImage}”里的user.UserImage为绿色不是白色
原因,这个app:imageUrl是自定义的XML方法,不是系统自带的,因此需要自定义方法设置
解决:
1
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@BindingAdapter("app:imageUrl")
// 这里的函数名没有约束 编译时会根据上面的@注解进行绑定
public void loadImageForUrl(ImageView imageView, URL url) {
}
//也可以绑定多个
@BindingAdapter({"app:imageUrl","error"})
public void loadImageForUrl(ImageView imageView, String url, Drawable error) {
Log.i("setImageUrl", String.valueOf(url));
Log.d("setImageUrl", "setImageUrl is Called");
//Glide的使用
}
//XML中
app:imageUrl="@{itemViewModel.UserImage}"
app:error="@{@drawable/fengjing1}"
原理是:
通过@注解,设置自定义的xml的方法,app:imageUrl的组件去调用这个方法 传入这个组件(如imageView) 所以不需要findID 再传入方法中的值,(可以是常量,也可以是databinding的变量)
运行后会报错:
?
1
2
java.lang.IllegalStateException: Required DataBindingComponent is null in class ItemLayoutBinding.
A BindingAdapter in com.scnu.sihao.sinaweibodemo.ViewModel.ItemViewModel is not static and requires an object to use, retrieved from the DataBindingComponent. If you don't use an inflation method taking a DataBindingComponent, use DataBindingUtil.setDefaultComponent or make all BindingAdapter methods static. at android.databinding.ViewDataBinding.ensureBindingComponentIsNotNull(ViewDataBinding.java:554)
2 创建类implements DataBindingComponent
?
1
2
3
4
5
6
7
8
9
10
11
12
public class MyComponent implements android.databinding.DataBindingComponent{
private static ItemViewModel myItemViewModel;
@Override
public ItemViewModel getItemViewModel() {
return myItemViewModel;
}
public static void getObject3(ItemViewModel itemViewModel){
myItemViewModel=itemViewModel;
}
}
3 在使用了app:imageUrl的xml对应的Activity或者Adapter中
这里是Adapter
?
1
2
3
4
5
6
//通过DataBindingUtil加载我们的布局文件
//在这里我们实例化了一个我们定义的DataBindingComponent对象MyComponent
//这个是非常关键的一个地方,否则系统会使用DataBindingUtil#getDefaultComponent()拿到的默认实例作为参数
//如果我们在此之前没有调用DataBindingUtil.setDefaultComponent()方法,上面的方法就会返回null
ItemLayoutBinding itemLayoutBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_layout,
parent, false,n
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号