数据绑定技术DataBinding
程序员文章站
2022-06-08 16:29:06
...
数据绑定技术使用一
第一步添加配置
项目下的build.gradle下的android中defaultConfig下方添加代码:
dataBinding{
enabled true
}
第二步添加数据常量并设置set和get方法,因为偷懒就不写了
public class User {
private String name;
private String nickName;
private String email;
private boolean vip;
/**
* 点击用户名
*/
public void clickName(View view){
Toast.makeText(view.getContext(),"点击了用户名",Toast.LENGTH_LONG).show();
}
/**
* 长按昵称
*/
public boolean longClickName(View view){
Toast.makeText(view.getContext(),"长按了昵称",Toast.LENGTH_LONG).show();
return true;
}
}
第三步布局:type是自己定义常量的位置
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.hbwj.myapplication.User" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<!--是否是会员,是文字颜色为红色,不是文字颜色为黑色-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{user.clickName }"
android:text="@{user.nickName+'('+user.name+')'}"
android:textColor="@{user.vip?0xffff0000:0xff000000}" />
<!--user.nickName??user.name==user.nickName==null?user.name:user.nickName-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onLongClick="@{user.longClickName}"
android:text="@{user.nickName??user.name}" />
<!--不用用<或者>运算符,用<代替<;用>代替>-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.email}"
android:textColor="@{user.level < 3 ?0xffff0000:0xff000000}" />
</LinearLayout>
</layout>
第四步:activity下的使用
//setContentView(R.layout.activity_main);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user=new User();
user.setName("用户名");
user.setNickName("昵称");
user.setEmail("aaa@qq.com");
user.setLevel(5);
user.setVip(true);
binding.setUser(user);
数据绑定技术二
第一步:将之前的activitymain布局复制到userlayout中并且修改代码
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.hbwj.myapplication.User" />
</data>
<LinearLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<!--是否是会员,是文字颜色为红色,不是文字颜色为黑色-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{user.clickName }"
android:text="@{user.nickName+'('+user.name+')'}"
android:textColor="@{user.vip?0xffff0000:0xff000000}" />
<!--user.nickName??user.name==user.nickName==null?user.name:user.nickName-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onLongClick="@{user.longClickName}"
android:text="@{user.nickName??user.name}" />
<!--不用用<或者>运算符,用<代替<;用>代替>-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.email}"
android:textColor="@{user.level < 3 ?0xffff0000:0xff000000}" />
</LinearLayout>
</layout>
修改activity_main:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="user"
type="com.hbwj.myapplication.User" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal">
<include layout="@layout/user_layout"
app:user="@{user}"/>
<include layout="@layout/user_layout"
app:user="@{user}"/>
</LinearLayout>
</layout>
第二步:MainActivity中新增一个User对象
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
users = new ArrayList<>();
User user = new User();
user.setName("用户名");
user.setNickName("昵称");
user.setEmail("aaa@qq.com");
user.setLevel(5);
user.setVip(true);
User user1 = new User();
user1.setName("用户名2");
user1.setNickName("昵称2");
user1.setEmail("aaa@qq.com");
user1.setLevel(2);
user1.setVip(false);
users.add(user);
users.add(user1);
binding.setUsers(users);
第三步:修改主布局
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="com.hbwj.myapplication.User" />
<!--java.util.List<User>==List<User>-->
<variable
name="users"
type="java.util.List<User>" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal">
<include
layout="@layout/user_layout"
app:user="@{users[0]}" />
<include
layout="@layout/user_layout"
app:user="@{users[1]}" />
</LinearLayout>
</layout>
第四步:修改User中的点击事件
/**
* 点击用户名
*/
public void clickName(View view){
Toast.makeText(view.getContext(),"点击了:"+name,Toast.LENGTH_LONG).show();
}
/**
* 长按昵称
*/
public boolean longClickName(View view){
Toast.makeText(view.getContext(),"长按了:"+nickName,Toast.LENGTH_LONG).show();
return true;
}
数据绑定技术加载图片
首先布局user_layout中添加ImageView控件
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
app:imageUrl="@{user.icon}"/>
自定义一个工具类加载图片
/**
* 加载图片
*/
@BindingAdapter({"imageUrl"})//随便起,但要保证布局中设置的和它一样
public static void loadImageView(ImageView imageView,String url){
if(url==null){
imageView.setImageResource(R.drawable.ic_launcher);
}else {
Glide.with(imageView.getContext()).load(url).into(imageView);
}
}
设置图片的url,图片自己去网上找,风骚的,性感的,可爱的你想咋整你随意
user.setIcon("http://p0.so.qhimgs1.com/bdr/_240_/t019aa0ed00b08bc6ec.jpg");
数据绑定技术之listview的使用
首先第一步新建一个通用adapter
public class CommonAdapter<T> extends BaseAdapter {
private Context context;
private List<T> list;
private int layoutId;//布局的id
private int veriableId;//databinding的变量id
public CommonAdapter(Context context, List<T> list, int layoutId, int veriableId) {
this.context = context;
this.list = list;
this.layoutId = layoutId;
this.veriableId = veriableId;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewDataBinding binding;
if (convertView == null) {
binding = DataBindingUtil.inflate(LayoutInflater.from(context), layoutId, parent, false);
} else {
binding = DataBindingUtil.getBinding(convertView);
}
binding.setVariable(veriableId, list.get(position));
return binding.getRoot();
}
}
第二步:主布局
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="adapter"
type="android.widget.BaseAdapter" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:adapter="@{adapter}">
</ListView>
</LinearLayout>
</layout>
第三步:每个item的布局,本人比较懒,所以还是用之前的User:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="user"
type="com.hbwj.myapplication.User" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
app:imageUrl="@{user.icon}" />
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="100dp"
android:text="@{user.name}" />
</LinearLayout>
</layout>
最后一步就是使用了
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
users = new ArrayList<>();
for (int i = 0; i < 100; i++) {
User user = new User();
user.setIcon("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2367757340,3418517196&fm=27&gp=0.jpg");
user.setName("user" + i);
users.add(user);
}
//databinding会自动生成一个BR
CommonAdapter<User> adapter = new CommonAdapter<>(MainActivity.this, users, R.layout.item, BR.user);
binding.setAdapter(adapter);
图片你自己可以上网搜,一大片,什么类型的都有,绝对足够符合你的口味。
给listview添加点击事件并且刷新数据
首先在User类中添加点击事件
public void onClick(View view) {
setName(getName() + "(已点击)");
}
item的布局中添加点击事件,图片、文字或者两者添加以下代码:
android:onClick="@{user.onClick}"
立即刷新数据
1.让user类继承与BaseObservable
2.getName方法中添加@Bindable注解 @Bindable public String getName() { return name; }
3.setName方法中刷新数据 public void setName(String name) { this.name = name; notifyPropertyChanged(BR.name); }
下一篇: PHP和其它语言_PHP教程