他来了,他来了,他带着MVVM的BRVAH走来了!再不看又错过了

首先,大家可以看我library中的CSBrvahBindingAdapter这个类,里面就是通过BindingAdapter的方法,将列表跟适配器绑定在一起。然后是CSItemBindingAdapter这个适配器,这就是本控件核心的适配器了,在这个adapter中,调用了databinding的绑定方法。然后大家可以看BaseBindingViewModel这个类,这个是viewModel的基类,里面将一些属性和方法定义,还有仿网络请求的动作跟列表结合。后面边写边解释。

还有再提醒一下,大家看文章,要跟demo结合起来食用,不然可能会看得有点模糊。

首页样式

例子列表截图:

首页列表调用方式:

非常简单,这个是Activity的内容,只要绑定viewModel,然后调用model.load(),加载列表的数据就可以了

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil
.setContentView(this, R.layout.activity_main)
val model = MainViewModel()
binding.vm = model
model.load()
CSLog.Open()//测试用开启日志
}

首页的viewModel:

@Override//获取绑定的布局和数据
protected Map<Integer, CSBravhItemBinding> getItemBinding() {
Map<Integer, CSBravhItemBinding> mp = new HashMap<>();
mp.put(0, new CSBravhItemBinding(BR.bean, R.layout.item_main, BR.action, new Action()));
return mp;
}

@Override//已经集成好的加载数据的方法
public void load() {
load(getData());
}

//另外的点击事件动作,我为了方便这样写,也可以mvvm模式默认是写在data数据中
public class Action implements CSAction1 {
@Override
public void call(MainData param) {
Intent intent = new Intent(FramGroble.INSTANCE.getTopActivity(), param.activity);
FramGroble.INSTANCE.getTopActivity().startActivity(intent);
}
}

//模拟网络请求的数据
private Flowable<List> getData() {
return Flowable.create(new FlowableOnSubscribe<List>() {
@Override
public void subscribe(FlowableEmitter<List> emitter) throws Exception {
ArrayList data = new ArrayList<>();
data.add(new MainData(“Animation,line,加载动画效果”, AnimationActivity.class));
data.add(new MainData(“Animation,Grid,加载自定义动画效果”, AnimationCustomActivity.class));
data.add(new MainData(“MultipleItem,line,多布局”, MultipleLineActivity.class));
data.add(new MainData(“非MultipleItem,Grid,多布局,(不想继承MultiItemEntity,用自己的bean类)”, NonMultipleActivity.class));
data.add(new MainData(“添加多个头部和尾部,有各自的数据,优雅”, HeadFootActivity.class));
data.add(new MainData(“空布局及下拉刷新”, EmptyRefreshActivity.class));
data.add(new MainData(“侧滑删除”, SwipeActivity.class));
data.add(new MainData(“长按拖动,多布局”, DragActivity.class));
data.add(new MainData(“可扩展的,多布局”, ExpandActivity.class));
data.add(new MainData(“下拉刷新,上拉加载”, LoadMoreLineActivity.class));
data.add(new MainData(“聊天界面,下拉加载”, LoadMoreChatActivity.class));
data.add(new MainData(“2个列表的绑定,仿外卖”, TwoListActivity.class));
data.add(new MainData(“用自己的适配器(继承万能适配器)”, CustomAdapterActivity.class));
emitter.onNext(data);
emitter.onComplete();
}
}, BackpressureStrategy.BUFFER);
}

@Override//设置自定义item的间距
public RecyclerView.ItemDecoration onitemDecoration() {
return new NormalLineDecoration(30, true);
}

viewModel中,没有复杂的逻辑调用,只有一些回调。只要继承BaseBindingViewModel<>,里面设置数据的泛型,(多布局泛型下面说明),通过getItemBinding()这个回调,设置每个item的布局与绑定的数据(可以绑定多个data),其中map的键就是itemType的类型,如果是单布局,写0就可以了,如果是多布局,按照itemType类型写,mainActivity中的item,还另外绑定了一个事件Action,我这边是设置为item的点击事件。load()中的回调,调用了load(getData())来加载数据(我这边使用rxjava来模拟数据的加载,现在的项目基本都是用retrofit和rxjava结合获取网络请求)。最下面的onitemDecoration()回调,是设置recyclerview的item间距。是不是很干净整洁,逻辑一目了然。

这时,就会有人问:哎呀,古诚欺啊,为什么没有看到列表的适配器啊。嘿嘿,适配器已经封装在BaseBindingViewModel中了,别急,后面会一一讲到,接下来,来看布局文件,超级简单:

<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}”
/>

databinging的格式就不多说了,其中,app:cs_brvah_adapter=“@{vm.bindingAdapter}”,就是绑定viewModel中的适配器,因为在BaseBindingViewModel这个基类中已经初始化好了,所以直接引用就可以了。app:cs_brvah_Decoration="@{vm.itemDecoration}"这个是绑定Decoration,也就是设置每个item的间隔,在上面的viewModel中,不是有onitemDecoration()回调么,就可以自己定制。

怎么样,是不是特别地简便。目前只是简单地说明一个,接下来会慢慢地讲解,越后面,本控件的便捷之处就越会体现,有不懂的可以集合例子看,就会明白的。

怎么引用该控件

这时就会有人问:哎呀,古诚欺啊,那该怎么依赖这么方便快捷的控件呢?

很简单,在根build.gradle中:

allprojects {
repositories {

maven { url ‘https://jitpack.io’ }
}
}

然后,如果你项目是使用AndroidX的,就引用该地址:

dependencies {
implementation ‘com.github.CaesarShao:CSBrvahBindingX:1.0.8’
}

如果项目不支持AndroidX的,就引用:

dependencies {
implementation ‘com.github.CaesarShao:CSBrvahBinding:1.0.8’
}

还有,因为我依赖的万能适配器的版本是com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.50,所以大家项目中的版本最好不低于2.9.50。不然可能会有兼容问题。

是不是贼贴心,都给大家考虑到了.好接下来我就一一讲解具体的调用方式,请大家耐心看下去。

###调用BRVAH自带的动画及line模式

Activity的调用我就不讲了,很简单,大家看AnimationActivity这个类常规调用,先将代码贴出来:

public AdapterView.OnItemSelectedListener onItemClickListener = getOnItemCli();

//构造方法,里面可以设置基础属性
public AnimationViewModel() {
super();
//该viewmodel是演示效果,实际在构造方法中,直接调用即可,
// animationType.set(BaseQuickAdapter.SLIDEIN_BOTTOM);
}

@Override
protected Map<Integer, CSBravhItemBinding> getItemBinding() {
Map<Integer, CSBravhItemBinding> mp = new HashMap<>();
mp.put(0, new CSBravhItemBinding(com.caesar.brvahbinding.BR.bean, R.layout.item_simple));
return mp;
}

@Override
public void load() {
load(CreateData.getSimpleData());
}

//这个是Spinner控件的OnItemSelectedListener的监听,在布局中绑定,当spinner使用时,会回调这个方法.
public AdapterView.OnItemSelectedListener getOnItemCli() {
return new AdapterView.OnItemSelectedListener() {

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
switch (position) {
case 0:
animationType.set(BaseQuickAdapter.SLIDEIN_BOTTOM);
break;
case 1:
animationType.set(BaseQuickAdapter.ALPHAIN);
break;
case 2:
animationType.set(BaseQuickAdapter.SCALEIN);
break;
case 3:
animationType.set(BaseQuickAdapter.SLIDEIN_LEFT);
break;
case 4:
animationType.set(BaseQuickAdapter.SLIDEIN_RIGHT);
break;
}
}

@Override
public void onNothingSelected(AdapterView<?> parent) {

}
};
}

@Override
public RecyclerView.ItemDecoration onitemDecoration() {
return new NormalLineDecoration(30, true);
}

大家先看布局文件,有一个

app:cs_brvah_animation=“@{vm.animationType}”,这个就是设置brvah自带的动画效果,当依赖好之后,只要在viewmodel的构造方法中设置,比如animationType.set(BaseQuickAdapter.SLIDEIN_BOTTOM);这样调用就可以了,如果布局中依赖过,它默认的动画效果是BaseQuickAdapter.SLIDEIN_BOTTOM。

然后在RecyclerView中,绑定adapter之后,就是app:cs_brvah_adapter=“@{vm.bindingAdapter}”,会默认设置RecyclerView的显示方式为LinearLayoutManager。

如何加载自定义动画和GridLayoutManager呢

大家看AnimationCustomActivity这个界面,

<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_animation_custom=“@{vm.customAnimation}”
app:cs_brvah_layoutManager=“@{CSBrvahLayoutManager.grid(2)}” />

@Override
protected Map<Integer, CSBravhItemBinding> getItemBinding() {
Map<Integer, CSBravhItemBinding> mp = new HashMap<>();
mp.put(0, new CSBravhItemBinding(com.caesar.brvahbinding.BR.bean, R.layout.item_simple));
return mp;
}

@Override
public void load() {
load(CreateData.getSimpleData());

@Override
public RecyclerView.ItemDecoration onitemDecoration() {
return new GridSpacingItemDecoration(2, 30, true);
}

@Override//设置自定义动画
public BaseAnimation onCustomAnimation() {
return new CustomAnimation();
}

可以看到,布局文件中,绑定了2个其他的东西,其中app:cs_brvah_animation_custom=“@{vm.customAnimation}“就是绑定自定义动画,在viewModel中的onCustomAnimation()回调中设置,我这边copy了brvah官方的自定义动画。在布局文件中,还可以看到,我引入了,在RecyclerView中,我调用,app:cs_brvah_layoutManager=”@{CSBrvahLayoutManager.grid(2)}”,这个就是将列表的显示方式,设置为2格的GridLayoutManager,大家可以去看看CSBrvahLayoutManager这个类,里面有设置各种LayoutManager的方法。

多布局,实现MultipleItem

大家看MultipleLineActivity这个类,activity还

大家可以看到,布局文件很简单,跟首页的基本一模一样,在MultiLineViewModel中,继承baseviewmodel时,要传泛型为MultiItemEntity,可以看到,是不是跟其他的基本一毛一样,然后每个item的data也都很简单。

这时,就会有同学问了:诶呀,古诚欺啊,如果我想要我的item数据不实现MultiItemEntity怎么办?当然可以。

item不实现MultiItemEntity的多布局

@Override
public void load() {
load(getData());
}

private Flowable<List> getData() {
return Flowable.create(new FlowableOnSubscribe<List>() {
@Override
public void subscribe(FlowableEmitter<List> emitter) throws Exception {
ArrayList data = new ArrayList<>();
data.add(new MultiDataOne(“这货是个标题”, “这货是个内容加描述”, R.mipmap.head_img1));
data.add(new MultiDataZero(“这货是个标题”, “这货是个内容加描述”, R.mipmap.head_img0));
data.add(new MultiDataTwo(“这货是个标题”, “这货是个内容加描述”, R.mipmap.head_img2));
data.add(new MultiDataZero(“这货是个标题”, “这货是个内容加描述”, R.mipmap.head_img1));
data.add(new MultiDataZero(“这货是个标题”, “这货是个内容加描述”, R.mipmap.head_img1));
data.add(new MultiDataOne(“这货是个标题”, “这货是个内容加描述”, R.mipmap.head_img1));
data.add(new MultiDataTwo(“这货是个标题”, “这货是个内容加描述”, R.mipmap.head_img2));
data.add(new MultiDataOne(“这货是个标题”, “这货是个内容加描述”, R.mipmap.head_img1));
data.add(new MultiDataOne(“这货是个标题”, “这货是个内容加描述”, R.mipmap.head_img0));
data.add(new MultiDataTwo(“这货是个标题”, “这货是个内容加描述”, R.mipmap.head_img0));
data.add(new MultiDataZero(“这货是个标题”, “这货是个内容加描述”, R.mipmap.head_img1));
data.add(new MultiDataOne(“这货是个标题”, “这货是个内容加描述”, R.mipmap.head_img1));
emitter.onNext(data);
emitter.onComplete();
}
}, BackpressureStrategy.BUFFER);
}

@Override
public RecyclerView.ItemDecoration onitemDecoration() {
return new NormalLineDecoration(30, true);
}

<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_animation=“@{vm.animationType}” />


···
大家可以看到,布局文件很简单,跟首页的基本一模一样,在MultiLineViewModel中,继承baseviewmodel时,要传泛型为MultiItemEntity,可以看到,是不是跟其他的基本一毛一样,然后每个item的data也都很简单。

这时,就会有同学问了:诶呀,古诚欺啊,如果我想要我的item数据不实现MultiItemEntity怎么办?当然可以。

item不实现MultiItemEntity的多布局

<?xml version="1.0" encoding="utf-8"?>



<androidx.recyclerview.widget.RecyclerView
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:padding=“4dp”
app:cs_brvah_Decoration=“@{vm.itemDecoration}”
app:cs_brvah_adapter=“@{vm.bindingAdapter}”
app:cs_brvah_layoutManager=“@{CSBrvahLayoutManager.grid(4)}”
app:cs_brvah_multiType=“@{vm.multiTypeDelegat}”
app:cs_brvah_spansize=“@{vm.spanSizeLookup}” />
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】

Android精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

【算法合集】*

[外链图片转存中…(img-3ruazjxY-1713508159347)]

【延伸Android必备知识点】

[外链图片转存中…(img-k6o5pa6m-1713508159348)]

【Android部分高级架构视频学习资源】

Android精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 27
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值