26
2017
09

MVVM的简单使用流程

简介

  • 描述使用MVVM
  • 简单使用
  • 代码展示
  • 总结

简单介绍:

好久没和大家分享文章了,今天和大家分享一下MVVM框架的简单使用,以前都是用的MVP模式写的代码,刚接触MVVM有点晕,其实用的一段感觉挺好用的,最实用的我感觉就是不用我们去找控件的ID,也解决了我们程序员最为烦恼的命名问题,我们XML直接针对的是Bean对象所以控件就不用给ID直接可以调用。别的不多说了直接上代码。

RexecyclerView列表代码展示

  • 步骤一
    首先我们先导入依赖在APP的build.gradle里面添加以下依赖
    dataBinding {
    enabled = true
    }

定义XML

<?xml version="1.0" encoding="utf-8"?>
<layout  xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" >

    <LinearLayout  style="@style/all_layout" >
      <android.support.v7.widget.RecyclerView  android:id="@+id/findHrecycler" android:layout_width="match_parent" android:layout_height="match_parent">

      </android.support.v7.widget.RecyclerView>

    </LinearLayout>

</layout>
  • 讲解
    我们可以看出上面我们在定义XML里面就和我们以往写的不一样,他是最外层包了一个标签我们通过这个标签就可以去在view层(Activity、fragment)里面调用dataBindingUtil来指定布局并且返回当前主页面的布局,在通过他就可以找到控件;然后我们看下bean对象。
public class FindBean {
    private String name;
    private String tuurl;

    public FindBean(String name, String tuurl) {
        this.name = name;
        this.tuurl = tuurl;
    }

    public FindBean() {
        super();
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setTuurl(String tuurl) {
        this.tuurl = tuurl;
    }

    public String getName() {
        return name;
    }

    public String getTuurl() {
        return tuurl;
    }
}
  • 简单的bean对象和我们以前写的一样
    我们在看下适配器

public class FindAdapter extends RecyclerView.Adapter<BindingViewHolder>{
    private Context mContext;
    private OnItemClickListener mOnItemClickListener;
    private LayoutInflater mLayoutInflater;
    private List<FindBean> mBeanList;
    public interface OnItemClickListener{
        void OnMyBeanClick(FindBean findBean);
    }

    public FindAdapter(Context context) {
        mContext = context;
        mLayoutInflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mBeanList=new ArrayList<>();
    }

    @Override
    public BindingViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ViewDataBinding binding= DataBindingUtil.inflate(mLayoutInflater,
                R.layout.item_find,parent,false);
        return new BindingViewHolder(binding);
    }

    @Override
    public void onBindViewHolder(BindingViewHolder holder, int position) {
        final FindBean findBean = mBeanList.get(position);
        holder.getBinding().setVariable(BR.bean,findBean);
        holder.getBinding().executePendingBindings();
// 设置条目点击事件
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnItemClickListener != null) {
                    mOnItemClickListener.OnMyBeanClick(findBean);
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return mBeanList.size();
    }
    public void setonListener(OnItemClickListener listener){
         mOnItemClickListener=listener;
    }
        public void addAll(List<FindBean> finbean){
            mBeanList.addAll(finbean);
        }

}
  • 还有一个viewholder

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;
    }
}
  • 最后我们在主页面调用
public class FindFragment extends BaseFragment {
      FragmentFindBinding mBinding;
    private List<FindBean> mList = new ArrayList<>();
    private FindAdapter mFindAdapter;

    @Override
    protected ViewDataBinding onCreateContentDataBinding(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle) {
        return mBinding= DataBindingUtil.inflate(layoutInflater, R.layout.fragment_find,viewGroup,false);
    }

    @Override
    protected void initComponents(View createView, Bundle savedInstanceState) {
        super.initComponents(createView, savedInstanceState);

        mBinding.findHrecycler.setLayoutManager(new LinearLayoutManager(getActivity()));
        mFindAdapter = new FindAdapter(getActivity());
        mBinding.findHrecycler.setAdapter(mFindAdapter);
        mFindAdapter.setonListener(new FindAdapter.OnItemClickListener() {
            @Override
            public void OnMyBeanClick(FindBean findBean) {
                   Toast.makeText(getActivity(),""+findBean.getName(),Toast.LENGTH_SHORT).show();
            }
        });
        initdate();
    }

    private void initdate() {
        mList.add(new FindBean("测试数据",""));
        mList.add(new FindBean("测试数据",""));
        mList.add(new FindBean("测试数据",""));
        mList.add(new FindBean("测试数据",""));
        mFindAdapter.addAll(mList);
    }
}
  • Item的布局
    细心的朋友可以看到我的textview是没有给他设置ID的但是我在数据显示的时候就通过findbean类就可以给textview进行赋值。
<?xml version="1.0" encoding="utf-8"?>
<layout  xmlns:android="http://schemas.android.com/apk/res/android" >
    <data>
        <variable  name="bean" type="com.aioas.jieqianbao.find.bean.FindBean"/>
    </data>

<com.zhy.autolayout.AutoLinearLayout  android:layout_width="match_parent" android:background="@drawable/shadow_bg" android:orientation="vertical" android:layout_height="wrap_content">
    <ImageView  android:id="@+id/img_find" android:background="@drawable/guide_3" android:layout_width="match_parent" android:layout_height="245px"/>
<com.zhy.autolayout.AutoLinearLayout  android:layout_marginTop="30px" android:layout_marginBottom="30px" android:layout_width="match_parent" android:layout_height="wrap_content">
<TextView  android:paddingLeft="30px" android:textSize="30px" android:textColor="@color/text_san" android:text="@{bean.name}" android:layout_width="wrap_content" android:layout_height="wrap_content"/>

</com.zhy.autolayout.AutoLinearLayout>

</com.zhy.autolayout.AutoLinearLayout>

</layout>
  • 总结
    相信大家看了我的帖子会有点蒙,就是我们适配器里面就指定好对应的layout即可,然后我们Item里面控件是通过标签下面的 标签下面标签指定好的bean类的路径直接交互。就可以实现简单的数据展示。
上一篇:我们是怎样在项目内落地自动化测试体系的 下一篇:解决APP冷启动白屏/黑屏的问题