您的位置:首页 > 移动开发 > Android开发

android 学习笔记之data binding

2016-01-18 10:33 489 查看

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的数据

@Override
protected 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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: