一步一步教你實現安卓mvvm架構,雙向數據綁定(二)

上文講了普通界面的雙向數據綁定,本文講一下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!!

 

本文代碼:https://github.com/czl0325/MVVMTest-Android

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章