相信大家对MVVM这个框架不是很陌生的吧,它的底层实现就是通过DataBinding的
绑定实现的他的好处就是省去了我们频繁的寻找控件的id,我们直接就可以在xml里面
绑定Bean实体类的属性而赋值,如下代码:
<TextView
android:text="@{bean.name}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text="@{bean.sex}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
我们在说下ARouter路由框架吧,它是阿里进行的一次对Router的封装。
显示在app层的build.gradle里面
android{
.....
dataBinding{
enabled = true
}
}
在app层的build.gradle里面加入:
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
}
dependencies {
compile 'com.alibaba:arouter-api:1.2.1.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.1.2.1'
}
配置好上面以后,我们先用MVVM+dataBinding来布局和定义监听事件;
我们开始在xml文件里面布局的话,就在最外层加上标签和标签;
在标签里面就要指定我们的实体Bean对象和点击事件所封装的实体类:
下面这段代码是我们定义的一个面是一个Bean实体类和一个点击事件的类来引用
还有一个RecyclerView的列表展示;
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
>
<data>
<variable
name="bean"
type="com.weizhen.ceshidemo.CeShiBean"/>
<variable
name="event"
type="com.weizhen.ceshidemo.events.BindEvents"/>
data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.weizhen.ceshidemo.CeshiActivity">
<TextView
android:text="@{bean.name}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text="@{bean.sex}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:text="点击换名"
android:onClick="@{(view)->event.setData(view)}"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyview"
android:layout_width="match_parent"
android:layout_height="match_parent">
android.support.v7.widget.RecyclerView>
LinearLayout>
layout>
下面是实体Bean的类:
public class CeShiBean {
private String name;
private String sex;
public CeShiBean(String name, String sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public CeShiBean() {
super();
}
}
下面是点击事件的实体类
public class BindEvents {
CeshiActivity mCeshiActivity;
ActivityCeshiBinding bind;
public BindEvents(Activity activity) {
this.mCeshiActivity= (CeshiActivity) activity;
this.bind=((CeshiActivity) activity).mBinding;
}
public void setData(View view){
bind.setBean(new CeShiBean("修改名","女"));
}
}
还有实现列表展示的封装的ViewHoldler:
public class BindingViewHolder<T extends ViewDataBinding> extends RecyclerView.ViewHolder{
private T mbinding;
public BindingViewHolder(T binding) {
super(binding.getRoot());
mbinding=binding;
}
public T getBinding(){
return mbinding;
}
}
下面是我么的Adapter:
public class MyAdapter extends RecyclerView.Adapter {
private Context mContext;
private List data;
private OnItemClickListener mOnItemClickListener;
private LayoutInflater mLayoutInflater;
//定义一个接口来实现条目点击事件
public interface OnItemClickListener{
// 定义一个点击方法
void OnMyBeanClick(ItemBean itemBean,int position);
}
//对外提供一个方法调用点击事件
public void setonListener(OnItemClickListener listener){
mOnItemClickListener=listener;
}
public MyAdapter(Context context, List data) {
mContext = context;
this.data = data;
mLayoutInflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public BindingViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 添加viewholder的布局 返回给viewhlder
ViewDataBinding inflate = DataBindingUtil.inflate(mLayoutInflater, R.layout.item, parent, false);
return new BindingViewHolder(inflate);
}
@Override
public void onBindViewHolder(BindingViewHolder holder, final int position) {
final ItemBean itemBean = data.get(position);
// 绑定xml里里面的控件并赋值
holder.getBinding().setVariable(BR.itembean,itemBean);
// 提交执行绑定
holder.getBinding().executePendingBindings();
// 根据每一个item来实现点击事件传递给我们自定义的接口 调用方法实现接口回调
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnItemClickListener!=null){
mOnItemClickListener.OnMyBeanClick(itemBean,position);
}
}
});
}
@Override
public int getItemCount() {
return data.size();
}
}
还有就是我们的Activity
@Route(path = "/con/ceshi")
public class CeshiActivity extends AppCompatActivity {
public ActivityCeshiBinding mBinding;
List list=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_ceshi);
mBinding= DataBindingUtil.setContentView(this,R.layout.activity_ceshi);
initData();
mBinding.setBean(new CeShiBean("显示","男"));
mBinding.setEvent(new BindEvents(this));
mBinding.recyview.setLayoutManager(new LinearLayoutManager(this));
MyAdapter myAdapter = new MyAdapter(this, list);
mBinding.recyview.setAdapter(myAdapter);
// 设置点击事件
myAdapter.setonListener(new MyAdapter.OnItemClickListener() {
@Override
public void OnMyBeanClick(ItemBean itemBean, int position) {
Toast.makeText(CeshiActivity.this,"点击的条目是---》"+position,Toast.LENGTH_SHORT).show();
}
});
}
private void initData() {
for (int i = 0; i < 10; i++) {
ItemBean itemBean = new ItemBean();
itemBean.setName("今天"+i);
itemBean.setJianjie("jsgsgfgafk"+i);
list.add(itemBean);
}
}
}
// 这是一种单利模式的封装build里面是我们跳转的路径
ARouter.getInstance().build("/com/h")
// withString里面是我们跳转后传递的类型和参数
.withString("mkey","添加行我的数据")
// navigation就是执行跳转里面可以看到他分的组名
.navigation(this, new NavCallback() {
@Override
public void onArrival(Postcard postcard) {
String group = postcard.getGroup();
Log.e("zhao", "分组是: " + group);
Toast.makeText(MainActivity.this,"显示--》"+group,Toast.LENGTH_SHORT).show();
}
});
下面说下我们ARouter能够传递的类型:
//基础类型
.withString( String key, String value )
.withBoolean( String key, boolean value)
.withChar( String key, char value )
.withShort( String key, short value)
.withInt( String key, int value)
.withLong( String key, long value)
.withDouble( String key, double value)
.withByte( String key, byte value)
.withFloat( String key, float value)
.withCharSequence( String key, CharSequence value)
//数组类型
.withParcelableArrayList( String key, ArrayList extends Parcelable > value)
.withStringArrayList( String key, ArrayList value)
.withIntegerArrayList( String key, ArrayList value)
.withSparseParcelableArray( String key, SparseArray extends Parcelable> value)
.withCharSequenceArrayList( String key, ArrayList value)
.withShortArray( String key, short[] value)
.withCharArray( String key, char[] value)
.withFloatArray( String key, float[] value)
.withCharSequenceArray( String key, CharSequence[] value)
//Bundle 类型
.with( Bundle bundle )
//Activity 跳转动画
.withTransition(int enterAnim, int exitAnim)
//其他类型
.withParcelable( String key, Parcelable value)
.withParcelableArray( String key, Parcelable[] value)
.withSerializable( String key, Serializable value)
.withByteArray( String key, byte[] value)
.withTransition(int enterAnim, int exitAnim)