最近一段时间公司工作太忙了,而且加上自己比较懒,很少更新知识和文章了。到了年后公司平时很多一起玩的同事都要离职了,心情也不太好,很多小伙伴都要辞职另谋出路,经常面试得到一些不太好安卓行情的信息,让我必须面对现实,慢慢找回学习的状态!
好了,不瞎扯什么了,接到公司的任务一个图片上传的app需求,所以我又一次踏上了写活用RecyclerView的道路,下面我们先看看效果:
GIF的操作有点快,我们下面来详细分析一下需求:
1. 我们要根据后台传回来的数据,动态生成每一个图片选项卡;
2. 每个图片选项卡都可以点击拍照;
3. 可以任意添加和删除各个图片,并且上传数据。
看到这样的需求,很多人就会想,哎呀,这个简单了,用那个框架、哪个框架就能轻松做到以上的事情。我个人呢,比较喜欢用自己的思路化难为简。
解决问题的一开始,我的思路是用嵌套的RecyclerView来解决,想着想着有点懵圈了,因为有几个难点我要去克服:
1. 图片拍照需要onActivityResult,我怎么在adapter里面完成,写个接口?
2. 如何在第一层adapter里面控制第二层adapter的数据的增加和删除呢?事实上这个想法最后的试验失败就是由于在这里的数据处理老是出问题而不了了之;
第一次的想法失败,我就想难道嵌套的RecyclerView我是驾驭不了的吗。当我想放弃的时候,我自己就想起了以前师兄经常跟我说的一句话:“adapter是只是用来显示数据的,我们要尽量少的在adapter里面做处理逻辑的事情”,想到这句话,突然我就开窍了一样,想到另一种方法,就是把嵌套的adapter看成是一个只显示数据,而不处理数据的地方,我们应该把重点放在处理和改变数据,来改变adapter的显示。下面我们详细来讲讲这种思路,没兴趣听我吹牛逼的同学可以直接去下载源码看看源码下载。
1. 首先,我们来看看后台返回来的配置菜单数据是怎么样的,动态生成图片选项卡
先说明
一些关键的变量
当拿到这些数据,我们首先就是先动态的生成图片的选项卡:
我们生成了所需要的JavaBean,有同学会说为什么会多了一个photoList的呢,传回来的数据明明没有这个,你是不是没事找事做。这里我先不说,但是我只能说我加这个变量并没有喝醉酒。
好了,我们看看代码的处理:
if(phoneConfigBean.body.size > 0){
for(i in phoneConfigBean.body.indices){
if(!phoneConfigBean.body.get(i).id.isNullOrEmpty()){
//把拿到的数据一个个放进list里面
bodyBeanList.add(phoneConfigBean.body.get(i))
//因为要控制添加图片add的按钮,所以我们先给每条list添加一个空的字符串
bodyBeanList.get(i).photoList.add("")
}
}
//刷新适配器
mPhotoMenuAdapter.notifyDataSetChanged()
}else{
}
刷新完适配器,我们就基本做完第一步了:
我们根据数据动态生成了该有的图片选项卡了。
2. 灵活运用数据改变两层adapter的显示
下面就到了最重要的一步了,就是我们之前所说的核心部分,其实并不难,在第一步中,我们在JavaBean里面声明多了一个photoList终于要出场了,他可是主角,下面我们看看它怎么成为主角的:
我们要把整个第一层的adapter看成一个整体,不要单独的想第一层adapter里面的数据怎么单独处理。在第一层adapter里面即mPhotoMenuAdapter的onBindViewHolder里面把photoList直接就赋给了第二层adapter即PhotoAdapter,也就是说,PhotoAdapter只是负责显示photoList的数据就可以了,我们不用管在哪里处理了photoList的数据。无论photoList的数据在前面做了什么坏事,PhotoAdapter只需要在后面默默的显示phtotoList的数据就完事了,这样的话,我们就可以做到activity处理数据,adapter只负责显示数据这个理念了,即View与数据分离。
3. 增加一些拍照,和图片增加、删除的逻辑
1.增加点击事件(add按钮)
2.增加点击事件(删除图片数据)
好了,一看上去比较复杂的逻辑,其实可以用很简单的方法去实现。只要记住一句话,“adapter是只是用来显示数据的,我们要尽量少的在adapter里面做处理逻辑的事情”,所有问题都会迎刃而解。我一直想说,很多东西看上去很难,其实转换一下思维方式,再难的东西都是用简单的思路实现的。当然这个图片上传小框架是兼容安卓7.0以上系统的。好了,这一期就讲得差不多了,如果对我的代码有什么建议的同学可以跟我讨论一下,譬如说很多kotlin的问题我自己都没搞得懂~对我的项目有兴趣的同学可以下载我的源码一起学习和交流,共同进步!源码下载。