MVVM模式下RecyclerView與databinding的結合(2)

在這裏插入圖片描述
Demo地址

https://github.com/linqinen708/MyDatabindingRecyclerView

很早以前,寫過一篇文章
MVVM模式下RecyclerView與databinding的結合

講述瞭如何通過封裝RecyclerView和谷歌的Databinding的結合,後來在開發中,逐漸發現其不完善的地方,於是自己通過不斷摸索和優化,使其具備下拉刷新和上拉加載功能(不借用任何第三方庫),並且封裝了一些方法,方便直接邏輯判斷調用,下面簡單介紹下:

1.首先創建一個自己的adapter,繼承自BaseBindingAdapter,傳入2個參數(一個你自己需要的bean類,和Databinding的xml佈局類)

public class MyAdapter extends BaseBindingAdapter<MyBean, AdapterLayoutBinding> {
    public MyAdapter(Context context) {
        super(context);
    }

    @Override
    protected int getLayoutResId() {
        return R.layout.adapter_layout;
    }

    @Override
    protected void onBindItem(AdapterLayoutBinding binding, MyBean bean, int position) {
        binding.setBean(bean);
        binding.setViewModel(new MyViewModel(bean));
    }
}

你沒有看錯,整個adapter非常的簡單,重寫getLayoutResId方法返回你自己的xml佈局文件,再在
onBindItem方法中綁定你所需要的數據,就完成了一個adapter的最基本操作,不需要寫任何onCreateViewHolder方法和創建自己的ViewHolder,因爲這些我都已經在BaseBindingAdapter中封裝好了

2.傳入數據
傳統的adapter都會去創建一個List,我直接對其封裝在BaseBindingAdapter中,所以在使用時,你只用調用
mAdapter.getItems().add或者addAll方法即可,並且不需要再使用notifyItemRangeInserted或者notifyDataSetChanged方法去刷新數據,我在BaseBindingAdapter也封裝了數據的監聽,可以動態刷新數據

mAdapter.getItems().add(new MyBean("谷歌1", 25, R.drawable.ic_launcher_foreground, true));

至此,一個簡單的BaseBindingAdapter就可以使用了

不過這種adapter實在太簡單了,在很多場景中可能不夠用,比如需要HeaderView和FooterView的地方,或者可能複雜的業務邏輯需要多個itemView的時候,所以我對原本的BaseBindingAdapter進行了額外的優化和封裝,讓其可用性更強一些

1.HeaderView的使用

只需要在自己的adapter中,重新getHeaderViewLayoutResId方法,傳入自己的xml佈局即可

  @Override
    protected int getHeaderViewLayoutResId() {
        return R.layout.adapter_head_view_layout;
    }

如果也需要動態修改HeaderView的數據怎麼辦呢?

只要重寫onBindViewHolder方法即可
(注意!!!千萬不要刪除super.onBindViewHolder(holder, position),父類中已經封裝了普通itemView的onBindItem方法,如果刪除,則無法正常調用)

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        super.onBindViewHolder(holder, position);
        if (holder instanceof HeaderViewHolder) {
            AdapterHeadViewLayoutBinding binding = DataBindingUtil.getBinding(holder.itemView);
            if (binding != null) {
                binding.tvHeaderView.setText("大家好,我是HeaderView");
            }
        }
}

2.FooterView的使用
與HeaderView類似,重寫getFooterViewLayoutResId方法,
不過我做了一點額外的封裝處理,因爲一般的FooterView都是顯示上拉加載中,或者暫無更多數據等功能,所以我做了一個非常簡單的adapter_default_footer_view.xml佈局,佈局裏面只有一個TextView,默認顯示文字“暫無更多數據”
小夥伴們可以直接調用

mAdapter.showFooterView(false)

參數表示是否顯示FooterView
或者

mAdapter.showLoadMore(false) 

false 暫無更多數據,true 正在加載…

不必在adapter中重寫getFooterViewLayoutResId,就可以直接展示FooterView

3.需要根據後臺接口的數據,動態展示FooterView的 上拉加載更多,或者 暫無更多數據

直接將後臺的list傳入我封裝的方法toggleFootView中,
根據是否有數據,展示FooterView的暫無更多數據功能

mAdapter.toggleFootView(collection);

直接將後臺的list傳入我封裝的方法toggleLoadMore中,
根據是否有數據,展示FooterView的“正在加載…” 或者“暫無更多數據”功能

mAdapter.toggleLoadMore(collection)

4.關於上拉加載更多
RecyclerView 自帶的上拉加載更多

5.item的點擊事件

 mAdapter.setOnItemClickListener(new BaseBindingAdapter.OnItemClickListener<MyBean>() {
            @Override
            public void onItemClick(MyBean bean, int position) {
                Toast.makeText(getBaseContext(), "點擊第" + position + "個", Toast.LENGTH_SHORT).show();
            }
        });

Databinding有很多坑,新手很容易掉坑裏,附上自己整理的常見的一些方法的調用
谷歌的databinding常見用法

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