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

510 阅读4分钟

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

效果一(普通递归)效果二(项目实战)
C3373DFB89E4CB9652C3C646BE96BE89.gif25D2ACBA5FD6B84A47264A3550B732E2.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我自己封装的,大家可以先了解一下

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

完整代码

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