美文网首页高级UIAndroid开发
BRVAH的BaseRecyclerViewAdapterHel

BRVAH的BaseRecyclerViewAdapterHel

作者: 古诚欺 | 来源:发表于2020-01-11 21:21 被阅读0次

    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模式优雅结合(其二)

    相关文章

      网友评论

        本文标题:BRVAH的BaseRecyclerViewAdapterHel

        本文链接:https://www.haomeiwen.com/subject/pymbactx.html