Android 数据(Bean)类的递归(含完整Demo)

话不多说,先看一下今天要完成的效果:

效果一(普通递归) 效果二(项目实战)
C3373DFB89E4CB9652C3C646BE96BE89.gif 25D2ACBA5FD6B84A47264A3550B732E2.gif

还是老套路,“由简入奢”,先来简单了解一下什么是递归!

递归入门

递归就是如果满足条件的话就自己调用自己,直到条件不满足为止!

百度百科

先开看一个简单的案例:

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
复制代码

辅助图:

image.png

数据分析

先来看看今天使用的数据吧:

(部分)

{
            "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"
                }
                .....
            ]
        }
复制代码

不想看这个吗?那来看图片吧:

同一种颜色是同一级别

image.png

好了,数据就这么简单,再来了解一下数据是如何解析的吧!

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 就是上面的数据

image.png

这个很简单,解析的是第一层的数据,也就是黄色的这一层

image.png

来看看效果:

image.png

递归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有数据,那么就一直递归获取数据!

这种递归方式是一层递归完然后在递归下一层

image.png

来看看效果:

image.png

方式二

一层一层递归

先来看看代码:


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数据")
            }
        }
    }
复制代码

思路也很简单,知识先让递归第一层,当递归完然后在递归第二层即可

图解:

image.png

在递归完一层之后在递归下一层即可

来看看效果:

image.png

效果二

先再来瞅一眼效果图:

25D2ACBA5FD6B84A47264A3550B732E2.gif

思路分析:

  • 使用Dialog里面是RecyclerView底部弹出Json中的数据
  • 然后点击一层数据的时候,获取到下一层的数据并弹出(直到没有数据为止)

Dialog我是采用DialogFragment我自己封装的,大家可以先了解一下

这段代码涉及到很多类,我就不复制了,大家下载代码自己看吧~

完整代码

原创不易,您的点赞就是对我的支持!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享