retrofitApiService = retrofit.create(RetrofitApiService.class);
}
}
四、实现我们的功能
4.1 创建MainViewModel
首先是创建我们的MainViewModel,并添加,加载banner接口。(Repository数据层,也可以说是model层,放在后一篇)如下:
public class MainViewModel extends BaseViewModel {
public MainViewModel(@NonNull Application application) {
super(application);
}
@Override
protected void onCleared() {
super.onCleared();
}
public MutableLiveData<List> getBanners(){
//因为用到LiveData,我觉得都不需要切换到主线程了。LiveData可以帮我们做
//调用接口,返回我们的MutableLiveData<List>
final MutableLiveData<List> liveData = new MutableLiveData<>();
RetrofitManager.getInstance().getApiService().getBanner()
.subscribeOn(Schedulers.io())
.subscribe(new Consumer<ResponModel<List>>() {
@Override
public void accept(ResponModel<List> listResponModel) throws Exception {
liveData.postValue(listResponModel.getData());
}
}, new Consumer() {
@Override
public void accept(Throwable throwable) throws Exception {
}
});
return liveData;
}
}
4.2 MainActivity里
- 首先把xml改成我们的DataBinding布局
- 添加一个按钮,点击去请求我们的接口
- 增加第三方Banner去展示我们的数据
xml如下:
<com.youth.banner.Banner
android:id=“@+id/banner”
android:layout_width=“match_parent”
android:layout_height=“180dp”
/>
MainActivity继承我们的BaseActivity,并指明我们的 ViewModel 和DataBinding。
public class MainActivity extends BaseActivity<MainViewModel, ActivityMainBinding> {
@Override
protected int getContentViewId() {
return R.layout.activity_main;
}
@Override
protected void processLogic() {
initBanner();
binding.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getBanner();
}
});
}
private void getBanner() {
mViewModel.getBanners().observe(this, new Observer<List>() {
@Override
public void onChanged(List bannerBeans) {
updateBanner(bannerBeans);
}
});
}
private void initBanner() {
binding.banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR_TITLE_INSIDE);
//这是给banner添加图片加载器
binding.banner.setImageLoader(new GlideImageLoader());
}
private void updateBanner(List data) {
if (data == null || data.size() <= 0) {
return;
}
List urls = new ArrayList<>();
List titles = new ArrayList<>();
for (int i = 0; i < data.size(); i++) {
urls.add(data.get(i).getImagePath());
titles.add(data.get(i).getTitle());
}
binding.banner.setBannerTitles(titles);
binding.banner.setImages(urls);
binding.banner.start();
}
}
跟着项目走,你会跑通一个简单的MVVM项目。下一篇,将是最后终结篇。如果MVVM系列能帮到你的话,请帮楼主点个赞吧。谢谢
因为跟本文走,简单的MVVM会跑通。我这里就不贴demo链接了。下一篇,终结篇,将会放上终结篇demo链接。
最终运行的效果:
本文还涉及到的类有:
ResponModel
public class ResponModel implements Serializable {
public static final int RESULT_SUCCESS = 0;
private T data;
private int errorCode;
private String errorMsg;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public int getErrorCode() {
return errorCode;
}
public void setErrorCode(int errorCode) {
this.errorCode = errorCode;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
public boolean isSuccess(){
return RESULT_SUCCESS == errorCode;
}
}
BannerBean:
public class BannerBean implements Serializable {
/**
- desc : Android高级进阶直播课免费学习
- id : 23
- imagePath : https://wanandroid.com/blogimgs/67c28e8c-2716-4b78-95d3-22cbde65d924.jpeg
- isVisible : 1
- order : 0
- title : Android高级进阶直播课免费学习
- type : 0
- url : https://url.163.com/4bj
*/
private String desc;
private int id;
private String imagePath;
private int isVisible;
private int order;
private String title;
private int type;
private String url;
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getImagePath() {
return imagePath;
}
public void setImagePath(String imagePath) {
this.imagePath = imagePath;
}
public int getIsVisible() {
return isVisible;
}
public void setIsVisible(int isVisible) {
this.isVisible = isVisible;
}
public int getOrder() {
return order;
}
public void setOrder(int order) {
this.order = order;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
GlideImageLoader:
public class GlideImageLoader extends ImageLoader {
@Override
public void displayImage(Context context, Object path, ImageView imageView) {
Glide.with(context).load(path).placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.ic_launcher)
.centerCrop().into(imageView);
}
}
最后别忘记加上网络权限。加油~(是不是发现接口被LiveData取代了呢!)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)
![](https://img-blog.csdnimg.cn/img_convert/81ef395661b6ab9ec4704cad3eb8711d.jpeg)
面试宝典
面试必问知识点、BATJ历年历年面试真题+解析
学习经验总结
(一)调整好心态
心态是一个人能否成功的关键,如果不调整好自己的心态,是很难静下心来学习的,尤其是现在这么浮躁的社会,大部分的程序员的现状就是三点一线,感觉很累,一些大龄的程序员更多的会感到焦虑,而且随着年龄的增长,这种焦虑感会越来越强烈,那么唯一的解决办法就是调整好自己的心态,要做到自信、年轻、勤奋。这样的调整,一方面对自己学习有帮助,另一方面让自己应对面试更从容,更顺利。
(二)时间挤一挤,制定好计划
一旦下定决心要提升自己,那么再忙的情况下也要每天挤一挤时间,切记不可“两天打渔三天晒网”。另外,制定好学习计划也是很有必要的,有逻辑有条理的复习,先查漏补缺,然后再系统复习,这样才能够做到事半功倍,效果才会立竿见影。
(三)不断学习技术知识,更新自己的知识储备
对于一名程序员来说,技术知识方面是非常重要的,可以说是重中之重。**要面试大厂,自己的知识储备一定要非常丰富,若缺胳膊少腿,别说在实际工作当中,光是面试这一关就过不了。**对于技术方面,首先基础知识一定要扎实,包括自己方向的语言基础、计算机基础、算法以及编程等等。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
网”。另外,制定好学习计划也是很有必要的,有逻辑有条理的复习,先查漏补缺,然后再系统复习,这样才能够做到事半功倍,效果才会立竿见影。
(三)不断学习技术知识,更新自己的知识储备
对于一名程序员来说,技术知识方面是非常重要的,可以说是重中之重。**要面试大厂,自己的知识储备一定要非常丰富,若缺胳膊少腿,别说在实际工作当中,光是面试这一关就过不了。**对于技术方面,首先基础知识一定要扎实,包括自己方向的语言基础、计算机基础、算法以及编程等等。