BRVAH的BaseRecyclerViewAdapterHelper與MVVM模式優雅結合,Recyclerview如何在Databinding中快捷、方便地使用(三)

BRVAH的BaseRecyclerViewAdapterHelper與MVVM模式優雅結合(其一)

BRVAH的BaseRecyclerViewAdapterHelper與MVVM模式優雅結合(其二)
好,在看本篇之前,請先看我寫的上面2個篇章。

上一章講了加載更多。這時,就會有同學問:哎呀,古誠欺啊,那像聊天界面這種應該怎么實現呢?

這你問對人了,我們接著往下說。

向下加載更多,仿聊天界面。話不多說,先上圖


20191225134958836.gif
public abstract class FetchLoadBindingViewModel<B> extends BaseBindingViewModel<B> {
 
    //下拉監聽回調
    public BaseQuickAdapter.UpFetchListener upFetchListener;
    public int mPage;
    public int PageSize = 15;
    public int defaultStart;
    //其實就是一個item,我這邊為了保證聊天數據結構完美,就寫在這了,用戶可以自己寫,這邊的item就是,聊天到頭的item
    public FetchNomoreData fetchNomoreData = new FetchNomoreData();
    //加載失敗的item,跟上面的一樣,也是一個itemType,也是要在綁定數據時,要加上這個類別,作用是加載失敗時添加,點擊之后,重新加載.
    public FetchErrorData fetchErrorData = new FetchErrorData();
 
 
    public FetchLoadBindingViewModel(RecyclerView recyclerView) {
        super();
        this.mRecyclerView = recyclerView;
        upFetchListener = getUpFetchListener();
        emptyResId.set(getEmptyViewRes(EmptyViewType.LOADING));
        bindingAdapter.setUpFetchEnable(true);
        bindingAdapter.setStartUpFetchPosition(2);
    }
 
 
    protected BaseQuickAdapter.UpFetchListener getUpFetchListener() {
        return new BaseQuickAdapter.UpFetchListener() {
            @Override
            public void onUpFetch() {
                CSLog.Print("下拉加載更多了");
                loadMore();
            }
        };
    }
。。。
public class LoadMoreChatViewModel extends FetchLoadBindingViewModel<MultiItemEntity> {
    private boolean isFirst = true;
 
    //構造函數中,有個列表參數,目的是,當第一次加載成功時,滑到最下面
    public LoadMoreChatViewModel(RecyclerView recyclerView) {
        super(recyclerView);
 
    }
 
    //常規的綁定item,不過這邊加了另外2個item,加載到底和加載失敗的item,這部分用戶可以自己定義
    @Override
    protected Map<Integer, CSBravhItemBinding> getItemBinding() {
        Map<Integer, CSBravhItemBinding> mp = new HashMap<>();
        mp.put(0, new CSBravhItemBinding(com.caesar.brvahbinding.BR.data, R.layout.item_chat_left));
        mp.put(1, new CSBravhItemBinding(com.caesar.brvahbinding.BR.data, R.layout.item_chat_right));
        mp.put(30, new CSBravhItemBinding(com.caesar.brvahbinding.BR.data, R.layout.item_nomore_data));
        mp.put(31, new CSBravhItemBinding(com.caesar.brvahbinding.BR.data, R.layout.item_fetch_error, com.caesar.brvahbinding.BR.action, new brvah()));
        return mp;
    }
 
    //跟加載更多一樣
    @Override
    public void load(int mPage) {
        if (mPage == 3) {
            if (isFirst) {
                isFirst = false;
                load(getError());
            } else {
                load(getSimp());
            }
        } else if (mPage == 4) {
            load(getLast());
        } else {
 
            load(getSimp());
        }
 
    }
    。。。
}
  <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
            android:id="@+id/swp"
            android:layout_width="match_parent"
            app:refreshing="@{vm.isRefreshing}"
            android:layout_height="match_parent">
 
            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rv_show"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="5dp"
                app:cs_brvah_Decoration="@{vm.itemDecoration}"
                app:cs_brvah_layoutManager="@{CSBrvahLayoutManager.fetLinear()}"
                app:cs_brvah_adapter="@{vm.bindingAdapter}"
                app:cs_brvah_emptyClickListener="@{vm.emptyOnClickListener}"
                app:cs_brvah_emptyResId="@{vm.emptyResId}"
                app:cs_brvah_upFetchListener="@{vm.upFetchListener}" />
        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

眼尖的同學,是不是已經發現了,下拉加載的viewModel是繼承FetchLoadBindingViewModel的,大致一看,FetchLoadBindingViewModel跟LoadMoreBindingViewModel是不是差不多。不過,一個是上拉加載更多,一個是下拉加載更多。

其中BaseQuickAdapter.UpFetchListener upFetchListener就是下拉的監聽回調了。有些細節說一下,bindingAdapter.setStartUpFetchPosition(2)這個是設置從第幾個item開始加載,然后調用bindingAdapter.setUpFetchEnable(true)就開啟支持下拉加載功能。

好,然后我們看LoadMoreChatViewModel,在構造方法的時候,傳了一個Recyclerview參數,該作用就是,在第一次加載完成的時候,能夠使Recyclerview滑到最下面。

然后我們看布局文件,是不是還是千篇一律,綁定對應的屬性就OK了。就只要綁定app:cs_brvah_upFetchListener="@{vm.upFetchListener}"就OK了

如果我想要在2個,乃至多個列表中使用,又應該怎么辦?

同學,你這個問題問得很好,作為古誠欺,我又怎么可能會沒有考慮到呢。

雙布局綁定,仿外賣界面

20191225141821758.gif
public abstract class TwoListBindingViewModel<A, B> extends BaseViewModel {
 
//第一個列表的屬性
 
    //數據集
    public ObservableArrayList<A> itemsA;
    //數據綁定的布局及BR和data
    public Map<Integer, CSBravhItemBinding> itemBindingA;
    //適配器,可以用用戶自己的,但是必須要繼承CSItemBindingAdapter
    public CSItemBindingAdapter<A, BaseViewHolder> bindingAdapterA;
    //設置每個item的占的格數
    public BaseQuickAdapter.SpanSizeLookup spanSizeLookupA;
    //當多布局時,如果item不想繼承MultiItemEntity,可以用這個來設置每個itemType
   。。。
 
//第二個列表的屬性
 
    //數據集
    public ObservableArrayList<B> itemsB;
    //數據綁定的布局及BR和data
    public Map<Integer, CSBravhItemBinding> itemBindingB;
    //適配器,可以用用戶自己的,但是必須要繼承CSItemBindingAdapter
    public CSItemBindingAdapter<B, BaseViewHolder> bindingAdapterB;
    //設置每個item的占的格數
  。。。
 
    public TwoListBindingViewModel() {
 
 
        itemsA = new ObservableArrayLi
。。。
 <android.support.v7.widget.RecyclerView
                android:layout_width="0dp"
                app:cs_brvah_adapter="@{vm.bindingAdapterA}"
                android:layout_weight="1"
                android:layout_height="match_parent" />
 
            <android.support.v7.widget.RecyclerView
                android:id="@+id/rv_show"
                app:cs_brvah_adapter="@{vm.bindingAdapterB}"
                android:layout_width="0dp"
                android:layout_weight="3"
                android:layout_height="match_parent" />

大家看TwoListActivity界面,東西實在是簡單,跟單列表的差不多,你2個列表,那不就是綁定的屬性,多一倍么,是不是這個理,3個列表那就3倍。

可以看到,viewModel是繼承TwoListBindingViewModel的,這時要傳2個泛型了,列表1和列表2的數據類型。viewModel里面的內容實在太簡單了,我這邊就不貼了,看一下布局,恩,就是這么簡單。好

這時,就有同學發問了:那我以前寫了很多的適配器,難道就沒用了么,讓我放棄使用他們,我不舍得啊。

我就知道你會這么想,你放心,我已經考慮過這種情況,你仍舊可以使用你自己的適配器來實現快捷的綁定。

使用自己的適配器來集成

當然,前提是,你的適配器,是集成BRVAH的萬能適配器。

public class CustomAdapterViewModel extends BaseBindingViewModel<SimpleData> {
    public CustomAdapter customAdapter;
 
    //在viewModel中,初始化自己的構造器
    public CustomAdapterViewModel() {
        super();
        customAdapter = new CustomAdapter(R.layout.item_simple, items);
        customAdapter.isFirstOnly(false);
    }
 
    //因為是用自己的適配器,所以這個返回為空
    @Override
    protected Map<Integer, CSBravhItemBinding> getItemBinding() {
        return null;
    }
 
    @Override
    public void load() {
        load(CreateData.getSimpleData());
    }
 
    //因為自己的適配器沒有監聽items的改變事件,所以不會主動去刷新適配器,所以在數據加載完成的回調中,要主動刷新適配器.
    @Override
    public void onDataLoadComplete() {
        customAdapter.notifyDataSetChanged();
    }
 
    @Override
    public RecyclerView.ItemDecoration onitemDecoration() {
        return new NormalLineDecoration(30, true);
    }
}
<androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_show"
            android:layout_width="match_parent"
            app:cs_brvah_animation="@{vm.animationType}"
            android:layout_height="match_parent"
            app:cs_brvah_Decoration="@{vm.itemDecoration}"
            app:cs_brvah_adapter="@{vm.customAdapter}"
             />

大家找到CustomAdapterActivity這個界面,我自己新建了一個適配器為CustomAdapter,里面實現了databinding的數據綁定,然后在我的viewModel中初始化。因為是自己的適配器,所以getItemBinding這個方法就可以返回為空,然后因為適配器沒有監聽列表數據的變化監聽,所以在onDataLoadComplete每次數據加載完成的時候,都要去主動刷新它。其他的屬性設置都是一樣的,最后看布局代碼。原先綁定適配器是app:cs_brvah_adapter="@{vm.bindingAdapter}",現在因為你是使用自己的適配器,所以只要app:cs_brvah_adapter="@{vm.customAdapter}"綁定你自己的適配器就可以了,Soeasy。

側滑列表

先放圖說話

uy.gif

該功能很簡單,在我的框架中,有一個CSBrvahLayoutManager類,里面就可以設置Recyclerview的顯示方式,這個在上面的grid顯示中有用到,橫劃我們用到的是linear(@RecyclerView.Orientation final int orientation, final boolean reverseLayout) 這個方法,大家可以看HorlzonActivity這個界面,很簡單,跟普通的一樣,我這邊就不寫了,只寫一下布局中調用。

 <data>
        <variable
            name="vm"
            type="com.caesar.brvahbinding.horizontal.HorlzonViewModel" />
        <import type="com.caesarlib.brvahbinding.CSBrvahLayoutManager" />
        <import type="androidx.recyclerview.widget.RecyclerView"/>
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".horizontal.HorlzonActivity">
        。。。
        <androidx.recyclerview.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:cs_brvah_Decoration="@{vm.itemDecoration}"
            app:cs_brvah_adapter="@{vm.bindingAdapter}"
            app:cs_brvah_layoutManager="@{CSBrvahLayoutManager.linear(RecyclerView.HORIZONTAL,false)}" />
    </LinearLayout>

在布局文件中,我們導入com.caesarlib.brvahbinding.CSBrvahLayoutManager和androidx.recyclerview.widget.RecyclerView,然后在RecyclerView中,通過app:cs_brvah_layoutManager屬性添加CSBrvahLayoutManager.linear,其中第二個布爾參數,是設置你列表從尾部開始顯示,默認為false。

好了,以上就是我MVVM綁定萬能適配器插件的全部內容,如果有不清楚的,可以留言咨詢我。

BRVAH的BaseRecyclerViewAdapterHelper與MVVM模式優雅結合(其一)

BRVAH的BaseRecyclerViewAdapterHelper與MVVM模式優雅結合(其二)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,238評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,430評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,134評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,893評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,653評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,136評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,212評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,372評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,888評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,738評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,482評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,179評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,588評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,829評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,610評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,916評論 2 372

推薦閱讀更多精彩內容