一步一步教你實現安卓mvvm架構,雙向資料繫結(二)
阿新 • • 發佈:2018-12-19
上文講了普通介面的雙向資料繫結,本文講一下recyclerview的雙向資料繫結,整個工程只要寫一個adapter就夠了,不用像以前一個recyclerview寫一個adapter了,節省了至少80%的程式碼,什麼第三方庫都不需要了。強大的工具!
1. 建立一個通用的adapter類,採用泛型來傳入對應的model
public class ZLBindingAdapter<T> extends RecyclerView.Adapter<ZLBindingAdapter.BindingHolder> { private List<T> items ; private int variableId; private int layoutId; public ZLBindingAdapter(List<T> items, int variableId, int layoutId) { this.items = items; this.variableId = variableId; this.layoutId = layoutId; } @NonNull @Override public BindingHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), layoutId, viewGroup, false); return new BindingHolder(binding); } @Override public void onBindViewHolder(@NonNull BindingHolder bindingHolder, int i) { bindingHolder.bindData(items.get(i)); } @Override public int getItemCount() { return items.size(); } public class BindingHolder<T> extends RecyclerView.ViewHolder { ViewDataBinding binding; /** * @param binding 可以看作是這個hodler代表的佈局的馬甲,getRoot()方法會返回整個holder的最頂層的view * */ public BindingHolder(ViewDataBinding binding) { super(binding.getRoot()); this.binding = binding; } public void bindData(T item) { binding.setVariable(variableId ,item); } } }
items就是我們的資料列表,這裡我們是user的資料
variableId就是繫結的model物件,比如我們繫結user這個物件,variableId就是BR.user
layoutId是我們佈局檔案的id。
2. 然後我們的activity是這麼寫的。
recyclerView = findViewById(R.id.recyclerview); recyclerView.setLayoutManager(new LinearLayoutManager(this)); ZLBindingAdapter<User> bindingAdapter = new ZLBindingAdapter(users, BR.user, R.layout.item_belle); recyclerView.setAdapter(bindingAdapter); recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
3. 看效果:
強大吧,列表出來了。
我們要什麼型別,只要對應的泛型傳入即可,所有recyclerview通用一個adapter!!