zoukankan      html  css  js  c++  java
  • Android Data Binding代码实践(告别findViewById)(四)

    Data Binding实战(一)
    Data Binding语法解析(二)
    Data Binding高级使用方法(三)
    好了。继前三篇学习了Data Binding之后。我们能够发现它的强大之处有这么几点:

    1、使用MVVM模式,让整个项目结构清晰明了
    2、通过ViewModel连接View和Model,使得View与Model层解耦,分层后各司其职。维护方便
    3、易于项目的測试
    4、能够依据id自己主动生成View的对象,再也不用findViewById了

    好了。说了优点,当然也有不太好的地方。毕竟是今年刚刚推出来的,我总结出了两大缺点,我想以后的版本号肯定会改进的:

    1、Data Binding进行数据绑定时,不能通过代码提示写兴许代码。所有都是须要一个一个手写。并且语法检查仅仅在编译时检查。这个过程比較繁琐
    2、Data Binding眼下仅仅有单向绑定。并不能双向的绑定,兴许版本号加上了双向绑定我想谁能拒绝用它呢

    以下通过一个Demo来看Data Binding在RecyclerView中的使用:

    Model层

    就仅仅有一个User类,它继承自BaseObservable,并在getter方法中增加@Bindable注解,在setter方法中增加notifyPropertyChanged(),这样User中的数据更新时能够通知UI更新:

    public class User extends BaseObservable{
        private String userName;
        private String userPassword;
        private int userAge;
        @Bindable
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
            notifyPropertyChanged(com.sunzxyong.binding.BR.userName);
        }
        @Bindable
        public String getUserPassword() {
            return userPassword;
        }
    
        public void setUserPassword(String userPassword) {
            this.userPassword = userPassword;
            notifyPropertyChanged(com.sunzxyong.binding.BR.userPassword);
        }
        @Bindable
        public int getUserAge() {
            return userAge;
        }
    
        public void setUserAge(int userAge) {
            this.userAge = userAge;
            notifyPropertyChanged(com.sunzxyong.binding.BR.userAge);
        }
    
        public User(String userName, String userPassword, int userAge) {
            this.userName = userName;
            this.userPassword = userPassword;
            this.userAge = userAge;
        }
    }

    View层

    主界面:

    <layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
    
        <data>
    
        </data>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            tools:context=".MainActivity">
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="#03A9F4" />
    
            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </LinearLayout>
    </layout>

    recycler_item:

    <?

    xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.sunzxyong.binding.model.User"/> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="5dp" android:background="#009688" android:gravity="center" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.userName}" android:textSize="20sp" android:textColor="#ffffff" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.userPassword}" android:textSize="20sp" android:textColor="#ffffff" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{String.valueOf(user.userAge)}" android:textSize="20sp" android:textColor="#ffffff" /> </LinearLayout> </layout>

    recycler_item中绑定了User。

    ViewModel层:

    设置Toolbar和RecyclerView:
    我们通过得到ActivityMainBinding对象得到Toolbar控件和RecyclerView控件:

    //设置Toolbar
            ActivityMainBinding mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
            mainBinding.toolbar.setTitle("Android Data Binding代码实战");
            mainBinding.toolbar.setTitleTextColor(Color.WHITE);
            setSupportActionBar(mainBinding.toolbar);
    
            initData();
    
            //设置RecyclerView
            mainBinding.recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
            MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(this,users);
            mainBinding.recyclerView.setAdapter(adapter);

    BindingHolder:

    public class BindingHolder extends RecyclerView.ViewHolder {
        private RecyclerItemBinding binding;
    
        public BindingHolder(View itemView) {
            super(itemView);
        }
    
        public RecyclerItemBinding getBinding() {
            return binding;
        }
    
        public void setBinding(RecyclerItemBinding binding) {
            this.binding = binding;
        }
    }

    MyRecyclerViewAdapter:

    public class MyRecyclerViewAdapter extends RecyclerView.Adapter<BindingHolder> {
        private Context mContext;
        private List<User> users;
        private List<Integer> heights;
        public MyRecyclerViewAdapter(Context context,List<User> users) {
            this.mContext = context;
            this.users = users;
            initHeight();
        }
        private void initHeight(){
            heights = new ArrayList<>();
            for (int i = 0; i < users.size(); i++) {
                heights.add(200+(int)(300*Math.random()));
            }
        }
        @Override
        public BindingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            RecyclerItemBinding mItemBinding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.recycler_item, parent, false);
            BindingHolder mHolder = new BindingHolder(mItemBinding.getRoot());//得到根布局View设置给ViewHolder
            mHolder.setBinding(mItemBinding);//把mItemBinding设置给ViewHolder
            return mHolder;
        }
    
        @Override
        public void onBindViewHolder(BindingHolder holder, int position) {
            ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
            params.height = heights.get(position);
            holder.itemView.setLayoutParams(params);
    
            //通过holder.getBinding()得到Binding Class
            User user = users.get(position);
            holder.getBinding().setVariable(com.sunzxyong.binding.BR.user,user);//动态设置数据
    //        holder.getBinding().setUser(user);这样的方式也行,由于User继承自BaseObservable
            holder.getBinding().executePendingBindings();//马上更新UI
        }
    
        @Override
        public int getItemCount() {
            return users.size();
        }
    }
    

    效果:
    这里写图片描写叙述
    源代码地址
    好了,Android Data Binding眼下所有功能就讲完了
    Google官方文档:https://developer.android.com/intl/zh-cn/tools/data-binding/guide.html

  • 相关阅读:
    POJ3693 Maximum repetition substring —— 后缀数组 重复次数最多的连续重复子串
    SPOJ
    POJ2774 Long Long Message —— 后缀数组 两字符串的最长公共子串
    POJ3261 Milk Patterns —— 后缀数组 出现k次且可重叠的最长子串
    POJ1743 Musical Theme —— 后缀数组 重复出现且不重叠的最长子串
    SPOJ
    AC自动机小结
    HDU3247 Resource Archiver —— AC自动机 + BFS最短路 + 状压DP
    POJ1625 Censored! —— AC自动机 + DP + 大数
    Herding
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7261279.html
Copyright © 2011-2022 走看看