话不多说,先看一下今天要完成的效果:
效果一(普通递归) | 效果二(项目实战) |
---|---|
![]() |
![]() |
还是老套路,“由简入奢”,先来简单了解一下什么是递归!
递归入门
递归就是如果满足条件的话就自己调用自己,直到条件不满足为止!
先开看一个简单的案例:
public static void main(String[] args) {
int test = 10;
recursion(test);
}
//递归
public static void recursion(int test) {
test--;
if (test > 5) {
System.out.println(test);
recursion(test);
}
}
复制代码
运行结果为:
9
8
7
6
复制代码
可以看到和咋们上面说的一样,如果满足条件(test > 5) 就会一直执行,直到test < 5才会停止.
和for循环有点类似,其实递归从如果玩到炉火纯青也可以认为是“高高高高级for循环”
那么这段递归拿for怎么写呢?
int test = 10;
.....
System.out.println("=======for========");
for (int i = test; i > 0;) {
i--;
if (i > 5) {
System.out.println(i);
}
}
复制代码
运行结果为:
9
8
7
6
复制代码
辅助图:
数据分析
先来看看今天使用的数据吧:
(部分)
{
"code": 0,
"msg": "success",
"data": [
{
"name": "安全环保部",
"childs": [
{
"name": "消防队",
"id": "2351",
"childs": [
{
"name": "一班",
"id": "2919"
},
{
"name": "二班",
"id": "2920"
},
{
"id": "2351",
"name": "全部"
}
]
},
{
"name": "安全管理科",
"id": "2349"
},
{
"name": "环保管理科",
"id": "2350"
},
{
"name": "安全督查科",
"id": "2352"
},
{
"id": "2331",
"name": "全部"
}
],
"id": "2331"
},
{
"name": "锦源化工有限公司",
"childs": [
{
"name": "热电分厂",
"id": "2550",
"childs": [
{
"name": "热机工段",
"id": "2564",
"childs": [
{
"name": "运行一班",
"id": "2868"
},
{
"name": "运行三班",
"id": "2870"
},
{
"name": "运行四班",
"id": "2871"
},
{
"name": "白班",
"id": "2872"
},
{
"name": "运行二班",
"id": "2869"
},
{
"id": "2564",
"name": "全部"
}
]
},
{
"name": "电气工段",
"id": "2563",
....
},
{
"name": "脱硫工段",
"id": "2566",
....
},
{
"name": "燃运工段",
"id": "2561",
....
},
{
"name": "检修工段",
"id": "2565",
....
},
{
"name": "公用工段",
"id": "2562",
....
},
{
"id": "2550",
"name": "全部"
}
]
},
{
"name": "安全环保科",
"id": "2544"
......
},
{
"name": "原料分厂",
"id": "2551",
......
},
{
"name": "电石分厂",
"id": "2552",
......
},
{
"name": "设备管理科",
"id": "2549",
......
},
]
"id": "2368"
}
.....
]
}
复制代码
不想看这个吗?那来看图片吧:
同一种颜色是同一级别
好了,数据就这么简单,再来了解一下数据是如何解析的吧!
JSON解析
JSON我是采用的最原始的方法
JSON常用方法 | 说明 |
---|---|
JSONObject.getJSONArray( String key) | 解析数组 |
JSONObject(String data) | 解析对象 |
getString(String key) | 解析对象中的String |
getInt(String key) | 解析对象中的Int |
getBoolean(String key) | 解析对象中的Boolean |
getLong(String key) | 解析对象中的Long |
getDouble(String key) | 解析对象中的Double |
JSON还是很简单的,不太懂同学看一看这一篇感觉挺长的,应该还不错!
解析数据
先来看看代码:
val jsonData = JSONObject(RecursionUtil.data)
val dataList = jsonData.getJSONArray("data")
//最简单解析
private fun buildRecursion1(dataList: JSONArray) {
//循环
repeat(dataList.length()) {
val name = dataList.getJSONObject(it).get("name")
val id = dataList.getJSONObject(it).get("id")
textView.append("$name\t$id\n")
}
}
复制代码
- RecursionUtil.data 就是上面的数据
这个很简单,解析的是第一层的数据,也就是黄色的这一层
来看看效果:
递归Bean类数据(效果一)
方式一
按顺序递归出每一个值
来看看代码:
val jsonData = JSONObject(RecursionUtil.data)
val dataList = jsonData.getJSONArray("data")
//递归1
private fun recursion1(dataList: JSONArray) {
repeat(dataList.length()) {
val name = dataList.getJSONObject(it).get("name")
val id = dataList.getJSONObject(it).get("id")
textView.append("$name\t$id\n")
try {
recursion1(dataList.getJSONObject(it).getJSONArray("childs"))
} catch (e: Exception) {
Log.i("szj没有数据", e.message ?: "没有chlids数据")
}
}
}
复制代码
分析:
这里还是比较简单,如果childs有数据,那么就一直递归获取数据!
这种递归方式是一层递归完然后在递归下一层
来看看效果:
方式二
一层一层递归
先来看看代码:
val jsonData = JSONObject(RecursionUtil.data)
val dataList = jsonData.getJSONArray("data")
//递归2
private fun recursion2(dataList: JSONArray) {
repeat(dataList.length()) {
val name = dataList.getJSONObject(it).get("name")
val id = dataList.getJSONObject(it).get("id")
textView.append("$name\t$id\n")
}
repeat(dataList.length()) {
try {
recursion2(dataList.getJSONObject(it).getJSONArray("childs"))
} catch (e: Exception) {
Log.i("szj没有数据", e.message ?: "没有chlids数据")
}
}
}
复制代码
思路也很简单,知识先让递归第一层,当递归完然后在递归第二层即可
图解:
在递归完一层之后在递归下一层即可
来看看效果:
效果二
先再来瞅一眼效果图:
思路分析:
- 使用Dialog里面是RecyclerView底部弹出Json中的数据
- 然后点击一层数据的时候,获取到下一层的数据并弹出(直到没有数据为止)
Dialog我是采用DialogFragment我自己封装的,大家可以先了解一下
这段代码涉及到很多类,我就不复制了,大家下载代码自己看吧~
原创不易,您的点赞就是对我的支持!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END