本編文章簡單使用databinding,給剛入門的同學學習mvvm借鑑
進入正題
//在gradle android下加入
dataBinding {
enabled = true
}
.xml中包含常見控件還有recycleview
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="userInfo"<!--activity中binding有對應setUserInfo()-->
type="com.renli.mvvmdemo.been.UserInfo" />
<variable
name="click"
type="com.renli.mvvmdemo.activity.MvvmMainActivity" />
<!--在佈局中通過三元運算符等操作運算符來控制視圖的顯示或者隱藏,
需要在data節點標籤中做引用View-->
<import type="android.view.View"/>
<variable
name="isShow"
type="boolean" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{userInfo.name}"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"/>
<TextView
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{String.valueOf(userInfo.age)}"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_name" />
<Button
android:id="@+id/bt_update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_age"
android:onClick="@{click.btClick}"
android:text="更新"/>
<ImageView
android:id="@+id/iv_img"
android:layout_width="60dp"
android:layout_height="60dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/bt_update"
app:imagesUrl="@{userInfo.iconUrl}"
app:placeUrl="@{@drawable/bm_list}"
android:visibility="@{isShow?View.VISIBLE:View.GONE}"
/>
<CheckBox
android:id="@+id/cb_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="顯示/隱藏"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_img"
android:onCheckedChanged="@{click.onCheckedChanged}"/>
<EditText
android:id="@+id/et_input"
android:layout_width="match_parent"
android:layout_height="50dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/cb_check"
android:text="@={userInfo.name}"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_user"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/et_input"
android:layout_marginTop="10dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
activity中
public class MvvmMainActivity extends Activity {
private ActivityMvvmMainBinding binding;
UserInfo userInfo = new UserInfo();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_mvvm_main);
userInfo.setName("阿萌");
userInfo.setAge(20);
userInfo.setSex("男");
userInfo.setDetail("深圳");
userInfo.setIconUrl("https://網上圖片連接.jpg");
userInfo.setPlaceUrl(R.drawable.bm_list);
binding.setUserInfo(userInfo);
binding.setClick(this);
ArrayList<UserInfo> mList = new ArrayList<>();
mList.add(userInfo);
mList.add(userInfo);
UserAdapter adapter = new UserAdapter(this, mList);
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.VERTICAL);
binding.rvUser.setLayoutManager(manager);
binding.rvUser.setAdapter(adapter);
}
/**
* 點擊事件
* @param view
*/
public void btClick(View view){
//數據源改變更新UI
userInfo.setName("阿金金");
userInfo.setAge(30);
}
@BindingAdapter({"imagesUrl", "placeUrl"})//必須靜態方法
public static void image(ImageView view, String iconUrl, Drawable placeUrl){
Glide.with(view.getContext()).load(iconUrl).placeholder(placeUrl).error(R.mipmap.agent_icon).into(view);
}
public void onCheckedChanged(View view, boolean isChecked){
binding.setIsShow(isChecked);
}
}
定義ViewHolder
public class BindingViewHolder<T extends ViewDataBinding> extends RecyclerView.ViewHolder {
private T mBinding;
public BindingViewHolder(@NonNull T binding) {
super(binding.getRoot());
mBinding = binding;
}
public T getBinding(){
return mBinding;
}
}
adapter中
public class UserAdapter extends RecyclerView.Adapter<BindingViewHolder> {
private LayoutInflater inflater;
private ArrayList<UserInfo> mList = new ArrayList<>();
public UserAdapter(Activity activity, ArrayList<UserInfo> list){
mList = list;
inflater = LayoutInflater.from(activity);
}
@NonNull
@Override
public BindingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ViewDataBinding binding = DataBindingUtil.inflate(inflater, R.layout.activity_mvvm_main_item, parent, false);
return new BindingViewHolder(binding);
}
@Override
public void onBindViewHolder(@NonNull BindingViewHolder holder, int position) {
ViewDataBinding binding = holder.getBinding();
binding.setVariable(BR.userItem, mList.get(position));
binding.executePendingBindings();//讓數據立即生效
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
@Override
public int getItemCount() {
return mList.size();
}
}
adapter中的xml
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="userItem"
type="com.renli.mvvmdemo.been.UserInfo" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
android:text="@{userItem.name}" />
<TextView
android:id="@+id/tv_sex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toRightOf="@id/tv_name"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginLeft="20dp"
android:text="@{userItem.sex}" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
UserInfo實體類
public class UserInfo extends BaseObservable {
@Bindable
private String name;
@Bindable
private int age;
@Bindable
private String sex;
@Bindable
private String detail;
@Bindable
private String iconUrl;
@Bindable
private int placeUrl;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
notifyPropertyChanged(BR.age);
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
notifyPropertyChanged(BR.sex);
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
notifyPropertyChanged(BR.detail);
}
public String getIconUrl() {
return iconUrl;
}
public void setIconUrl(String iconUrl) {
this.iconUrl = iconUrl;
notifyPropertyChanged(BR.iconUrl);
}
public int getPlaceUrl() {
return placeUrl;
}
public void setPlaceUrl(int placeUrl) {
this.placeUrl = placeUrl;
notifyPropertyChanged(BR.placeUrl);
}
}