android Data Binding講解二
阿新 • • 發佈:2019-01-28
第二節主要講兩點:1、觀察者物件;2、動態繫結。
一、觀察者物件:一個繼承了BaseObservable的類,可以允許繫結一個監聽器到附加物件上,這個物件可以監聽到這個屬性的變化。例子如下:
程式碼:
1、在要生成BR欄位的屬性的getter函式上加上@Bindable;
2、在setter函式里加上notifyPropertyChanged(BR.XXXX); BR.XXXX實在編譯時生成的
public class User extends BaseObservable{ private String name; private int age; private boolean isVisible=true; public User(String name,int age,boolean isVisible){ this.name=name; this.age=age; this.isVisible=isVisible; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } @Bindable public boolean isVisible() { return isVisible; } public void setVisible(boolean visible) { isVisible = visible; //BR.visible在編譯的時候生成 notifyPropertyChanged(BR.visible); } public void setAge(int age) { this.age = age; } }
佈局檔案:
1、用import引入物件,就可以在佈局檔案中訪問這個物件,像在java中那樣;
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <data> <import type="android.view.View"/> <variable name="user" type="com.zfeng.databinding.User"/> <variable name="presenter" type="com.zfeng.databinding.MainPresenter"/> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text='@{user.visible?"點選消失":"點擊出來"}' android:onClick="@{()->presenter.clickVisible(user)}"/> <TextView android:id="@+id/main_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我是顯示文字" android:visibility="@{user.visible?View.VISIBLE:View.GONE}"/> </LinearLayout> </layout>
二、動態繫結
我們這裡用RecyclerView來做例子。
程式碼:
1、與普通的Adapter相比唯一的不同是把ViewHolder中的view加入到DataBinding中。
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainViewHolder> { private Context context; private ArrayList<User > arrayList; public MainAdapter(Context context){ arrayList=new ArrayList<>(); for(int i=0;i<10;i++){ User user=new User(i+"000",21,true); arrayList.add(user); } this.context=context; } @Override public MainAdapter.MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView=LayoutInflater.from(context) .inflate(R.layout.main_item,parent,false); MainViewHolder viewHolder=new MainViewHolder(itemView); return viewHolder; } @Override public void onBindViewHolder(MainAdapter.MainViewHolder holder, int position) { final User item=arrayList.get(position); holder.binding.setVariable(BR.user,item); holder.binding.executePendingBindings(); } @Override public int getItemCount() { return arrayList.size(); } class MainViewHolder extends RecyclerView.ViewHolder { private MainItemBinding binding; public MainViewHolder(View view){ super(view); binding=DataBindingUtil.bind(view); } public void binding(@NonNull User user){ binding.setUser(user); } } }
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding= DataBindingUtil.setContentView(this,R.layout.activity_main);
User user=new User("ZhaoFeng",28,true);
MainPresenter presenter=new MainPresenter(this,user);
binding.setUser(user);
binding.setPresenter(presenter);
binding.mainRecyclerview.setHasFixedSize(true);
binding.mainRecyclerview.setLayoutManager(new LinearLayoutManager(this));
binding.mainRecyclerview.setAdapter(new MainAdapter(this));
}
}
佈局檔案:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
</data>
<LinearLayout
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/main_recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</layout>
main_item.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.zfeng.databinding.User"/>
</data>
<LinearLayout
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="15dip"
android:text="@{user.name}"/>
</LinearLayout>
</layout>
通過這些程式碼,itemview就會獲得它響應的資料。