android 学习笔记之data binding

来源:互联网 发布:施瓦茨科普知乎 编辑:程序博客网 时间:2024/06/05 05:33

project build.gradle文件设置

classpath 'com.android.tools.build:gradle:1.3.0'classpath 'com.android.databinding:dataBinder:1.0-rc0'
添加依赖;

Module的build.gradle文件设置

apply plugin: 'com.android.databinding'
添加插件模块;

Java代码

在布局中定义data标签,使用variable对象
<layout xmlns:android="http://schemas.android.com/apk/res/android">    <data>        <variable            name="user"            type="com.qixingbang.myapplication.beans.User"/>    </data>    <RelativeLayout        android:layout_width="match_parent"        android:layout_height="match_parent">        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:text="@{user.getDisplayName()}"/>    </RelativeLayout></layout>

在对应的Activity中添加binding的数据
@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    ActivityBasicBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_basic);    User user = new User("Harry","Potter");    binding.setUser(user);}
至此可以利用databinding在控件上之间显示信息,而不需要获取控件的ID,方便数据控制简化代码,但是增加了布局文件和java代码的耦合,如下图:


那么,使用databinding的一个很好的实际案例就是给ListView之类的控件的itemView填充数据,在上边的基础上,给activity布局增加一ListView,编写ListView每个Item的View的布局如下:
<layout xmlns:android="http://schemas.android.com/apk/res/android">    <data>        <variable            name="user"            type="com.qixingbang.myapplication.beans.User"/>    </data>    <LinearLayout        android:orientation="horizontal"        android:layout_width="match_parent"        android:layout_height="50dp">        <TextView            android:layout_weight="1"            android:layout_width="0dp"            android:layout_height="match_parent"            android:gravity="center"            android:text="@{user.getDisplayName()}"/>        <TextView            android:layout_weight="1"            android:layout_width="0dp"            android:layout_height="match_parent"            android:gravity="center"            android:text="@{String.valueOf(user.getAge())}"/>    </LinearLayout></layout>

Adapter代码如下:
class ListAdapter extends BaseAdapter {    private Context mContext;    private List<User> mData;    public ListAdapter(List<User> list, Context context) {        mData = list;        mContext = context;    }    @Override    public int getCount() {        return mData.size();    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        //            View view = View.inflate(mContext,R.layout.item_userlist,null);        ItemUserlistBinding binding;        if (null == convertView) {            binding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.item_userlist, parent, false);            convertView = binding.getRoot();            convertView.setTag(binding);        } else {            binding = (ItemUserlistBinding) convertView.getTag();        }        if (null != binding) {            binding.setUser(mData.get(position));        }        return convertView;    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public Object getItem(int position) {        return mData.get(position);    }}
最基本的Adapter,关键代码在getView方法内,其中ItemUserlistBinding类是由databinding插件自动根据布局xml文件自动生成。
最后给ListVIew的Adapter添加数据即可:
List<User> list = new ArrayList<>();list.add(new User("lg", "Z", 1));list.add(new User("yk", "D", 2));list.add(new User("cy", "L", 3));list.add(new User("y", "L", 4));list.add(new User("lg", "Z", 5));list.add(new User("yk", "D", 6));list.add(new User("cy", "L", 7));list.add(new User("y", "L", 8));list.add(new User("lg", "Z", 9));list.add(new User("yk", "D", 10));list.add(new User("cy", "L", 11));list.add(new User("y", "L", 12));list.add(new User("lg", "Z", 13));list.add(new User("yk", "D", 14));list.add(new User("cy", "L", 15));list.add(new User("y", "L", 16));list.add(new User("lg", "Z", 17));list.add(new User("yk", "D", 18));list.add(new User("cy", "L", 19));list.add(new User("y", "L", 20));listView.setAdapter(new ListAdapter(list, this));

效果如下:


参考博客地址(详细):
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0603/2992.html;
http://blog.chengyunfeng.com/?p=734。

1 0
原创粉丝点击