今天來講說DataBinding在列表RecyclerView中的使用html
App中常常用到列表展現,Data Binding在列表中同樣能夠扮演重要的做用,直接綁定數據和事件到每個列表的item。java
過去咱們每每會使用ListView、GridView、或者GitHub上一些自定義的View來作瀑布流。自從RecyclerView出現後,咱們有了新選擇,只須要使用LayoutManager就能夠。android
RecyclerView內置的垃圾回收,ViewHolder、ItemDecoration裝飾器機制都讓咱們能夠堅決果斷地替換掉原來的ListView和GridView。dom
主佈局:mvvm
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_demo8_add" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="添加" /> <Button android:id="@+id/btn_demo8_refresh" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_weight="1" android:text="刷新" /> <Button android:id="@+id/btn_demo8_delete" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_weight="1" android:text="刪除" /> </LinearLayout> <android.support.v7.widget.RecyclerView android:id="@+id/demo8_recyclerview" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp"></android.support.v7.widget.RecyclerView> </LinearLayout> </layout>
item佈局:ide
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <import type="com.zhangqie.databinding.demo8.UserObservableBean"/> <variable name="userObserBean" type="UserObservableBean"/> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="100dp" android:descendantFocusability="blocksDescendants" android:orientation="horizontal"> <LinearLayout android:layout_width="wrap_content" android:layout_weight="1" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`編號:` + userObserBean.userId }" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`姓名:` +userObserBean.userName}" android:layout_marginTop="5dp" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_weight="1" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`年齡:` +userObserBean.userAge}" /> <!--必定要使用1f而不能是使用1 ,類型必須相對應--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:text="@{`性別:` + (userObserBean.userSex == 1f ? `男` : `女`)}" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="vertical" android:layout_marginRight="10dp" android:paddingBottom="10dp" > <Button android:id="@+id/btn_update" android:layout_width="wrap_content" android:layout_height="40dp" android:text="修改數據" /> <Button android:id="@+id/btn_delete" android:layout_width="wrap_content" android:layout_height="40dp" android:layout_marginTop="5dp" android:text="刪除數據" /> </LinearLayout> </LinearLayout> </layout>
ViewHolder佈局
public class RecyclerViewHolder extends RecyclerView.ViewHolder { public Item8MvvmBinding getItem8MvvmBinding() { return item8MvvmBinding; } public void setItem8MvvmBinding(Item8MvvmBinding item8MvvmBinding) { this.item8MvvmBinding = item8MvvmBinding; } //這裏只要給RecyclerView.ViewHolder返回一個view就能夠,因此咱們將構造方法中傳入databinding Item8MvvmBinding item8MvvmBinding; public RecyclerViewHolder(Item8MvvmBinding item8MvvmBinding) { super(item8MvvmBinding.getRoot()); this.item8MvvmBinding = item8MvvmBinding; } }
adapter:測試
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolder> implements View.OnClickListener{ private List<UserObservableBean> list; private Random random = new Random(System.currentTimeMillis()); public RecyclerViewAdapter(List<UserObservableBean> list) { this.list = list; } public OnItemOnClickListener getOnItemOnClickListener() { return onItemOnClickListener; } public void setOnItemOnClickListener(OnItemOnClickListener onItemOnClickListener) { this.onItemOnClickListener = onItemOnClickListener; } private OnItemOnClickListener onItemOnClickListener; public interface OnItemOnClickListener{ void onItemClick(View view, int position); } @Override public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Item8MvvmBinding item8MvvmBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item8_mvvm,parent,false); item8MvvmBinding.getRoot().setOnClickListener(this); return new RecyclerViewHolder(item8MvvmBinding); } @Override public void onBindViewHolder(RecyclerViewHolder holder, int position) { Item8MvvmBinding item8MvvmBinding = holder.getItem8MvvmBinding(); UserObservableBean userObservableBean = list.get(position); item8MvvmBinding.setVariable(com.zhangqie.databinding.BR.userObserBean,userObservableBean); //將position保存在itemView的Tag中,以便點擊時進行獲取 item8MvvmBinding.getRoot().setTag(position); item8MvvmBinding.btnUpdate.setOnClickListener(new OnBtnClickListener(1, userObservableBean)); item8MvvmBinding.btnDelete.setOnClickListener(new OnBtnClickListener(2, position)); // 馬上執行綁定 item8MvvmBinding.executePendingBindings(); } @Override public int getItemCount() { return list.size(); } public void addData(UserObservableBean userObservableBean){ int position = random.nextInt(list.size()+1); list.add(position,userObservableBean); notifyItemInserted(position);//添加操做的動畫 } public void deleteData(int positionn){ if (list.size() == 0){ return; } int position = random.nextInt(list.size()); list.remove(position); notifyItemRemoved(position);//刪除操做的動畫 } @Override public void onClick(View view) { if (onItemOnClickListener != null) onItemOnClickListener.onItemClick(view, (int) view.getTag()); } private class OnBtnClickListener implements View.OnClickListener{ private int stats;//1,修改;2,刪除 private UserObservableBean userBean; private int position; OnBtnClickListener(int stats, UserObservableBean userBean) { this.stats = stats; this.userBean = userBean; } OnBtnClickListener(int stats, int position) { this.stats = stats; this.position = position; } @Override public void onClick(View v) { switch (stats) { case 1: userBean.userName.set("修改後的名字"); break; case 2: list.remove(position); notifyDataSetChanged(); break; } } } }
主Activity:動畫
public class Demo8 extends AppCompatActivity { Demo8Binding demo8Binding; RecyclerViewAdapter recyclerViewAdapter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); demo8Binding = DataBindingUtil.setContentView(this, R.layout.demo8); initView(); } private void initView(){ RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); demo8Binding.demo8Recyclerview.setLayoutManager(layoutManager); recyclerViewAdapter = new RecyclerViewAdapter(initObservableData()); demo8Binding.demo8Recyclerview.setAdapter(recyclerViewAdapter); //item的點擊事件 recyclerViewAdapter.setOnItemOnClickListener(new RecyclerViewAdapter.OnItemOnClickListener() { @Override public void onItemClick(View view, int position) { Toast.makeText(Demo8.this, "行數:" + position, Toast.LENGTH_LONG).show(); } }); demo8Binding.btnDemo8Add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { UserObservableBean userBean = new UserObservableBean(); userBean.userId.set(8); userBean.userName.set("切切心語"+8); userBean.userAge.set(25); userBean.userSex.set(8 % 2 == 0 ? 1 : 0); recyclerViewAdapter.addData(userBean); } }); demo8Binding.btnDemo8Refresh.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { recyclerViewAdapter.notifyDataSetChanged(); } }); demo8Binding.btnDemo8Delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { recyclerViewAdapter.deleteData(1); } }); } //初始化測試數據 private List<UserObservableBean> initObservableData() { List<UserObservableBean> list = new ArrayList<>(); for (int i = 1; i < 6; i++) { UserObservableBean userBean = new UserObservableBean(); userBean.userId.set(i); userBean.userName.set("切切心語"+i); userBean.userAge.set(18 + i); userBean.userSex.set(i % 2 == 0 ? 1 : 0); list.add(userBean); } return list; } }
本身練習的一個RecyclerView + Databinding使用this
效果如圖: