前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android下拉五级菜单联动

android下拉五级菜单联动

作者头像
张泽旭
发布2018-12-10 16:42:10
2.5K0
发布2018-12-10 16:42:10
举报
文章被收录于专栏:张泽旭的专栏

android下拉五级菜单联动

一、问题引出

本人是一个不擅长Android的开发的,但是这几天在做联通的一个服务器配件管理系统,做完B/S的又要写C/S的,老板要求没办法。在做的过程中遇到了一个下拉菜单联动的问题,以前没做过,突然做还真有点不知所措了,在网上找了一大堆发现数据都是本地的应该构造好了,没卵用,不过也给了我很多想发,一开始想到用树去解决,可是每个树的节点个数不知道,要是动态创建就会很麻烦。最后在自己的努力下来构造JSON数据格式,其实弄明白感觉很简单,就是并保存你的上一级是谁,你的下一级是谁就可以了,但是数据库做的表没有结构可言很难构造出来有用的数据结构。

二、实例代码

数据库建表如下:

factory 下有多个 type ,这里有一点需要注意,不是 type 下有多个 products_name 而是,factory 和 type 要共同确定有那些 products_name , 好了就这样一次类推,顺序分别是 factory、type 、products_name 、 products_no 、 function . 由此得到的数据库查询语句有: select factory from bjlt_products_type group by factory ;

select type from bjlt_products_type where factory=#{0} group by type;

select products_name from bjlt_products_type where factory=#{0} and type=#{1} group by products_name;

select products_no from bjlt_products_type where factory=#{0} and type=#{1} and products_name=#{2} group by products_no;

select function from bjlt_products_type where factory=#{0} and type=#{1} and products_name=#{2} and products_no=#{3} group by function;

知道Mybatis的很容易看懂,我这里就不说了; 查询数据结构构造json数据代码

java后端数据代码
代码语言:javascript
复制
@ResponseBody
    @RequestMapping("/user_info/requestproductstypeApplication.html")
    public String user_infoProductsFactory(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        List<String> str_1 = bjlt_products_typeService.factory();
        String str1 = "";
        String str2 = "";
        String str3 = "";
        String str4 = "";
        String str5 = "";
        Json json = new Json();
        for (int i = 0; i < str_1.size(); i++) {
            str1 = str1 + str_1.get(i) + "$$";
			List<String> str_2 = bjlt_products_typeService.type(str_1.get(i));
			str2 = "";
			for (int j = 0; j < str_2.size(); j++) {
				str2 = str2 + str_2.get(j) + "$$";
                List<String> str_3 = bjlt_products_typeService.products_name(str_1.get(i), str_2.get(j));
                str3 = "";
                for (int z = 0; z < str_3.size(); z++) {

                    str3 = str3 + str_3.get(z) + "$$";
					List<String> str_4 = bjlt_products_typeService.products_no(str_1.get(i), str_2.get(j),
							str_3.get(z));
					str4 = "";
					for (int q = 0; q < str_4.size(); q++) {
						str4 = str4 + str_4.get(q) + "$$";
						List<String> str_5 = bjlt_products_typeService.function(str_1.get(i), str_2.get(j),
								str_3.get(z), str_4.get(q));
						str5 = "";
						for (int k = 0; k < str_5.size(); k++) {
							str5 = str5 + str_5.get(k) + "$$";
						}
						json.add(str_1.get(i) + "$$" + str_2.get(j) + "$$" + str_3.get(z) + "$$" + str_4.get(q), str5);
					}
					json.add(str_1.get(i) + "$$" + str_2.get(j) + "$$" + str_3.get(z), str4);
				}
				json.add(str_1.get(i) + "$$" + str_2.get(j), str3);
            }
            json.add(str_1.get(i), str2);
        }
        json.add("factory", str1);
        json.add("result", "ok");
        System.out.println(json.toString());
        // response.addHeader("Access-Control-Allow-Origin",
        // "http://127.0.0.1:8020");
        return json.toString();
    }

此代码是循环获取每个类别的数据,主要思想为键值保存他的父亲,值保存他下面的儿子,举个例子

代码语言:javascript
复制
{"华为": "BBU$$RRU$$"}//代表华为下有两个类别,到时候value可以直接用split取出字符数组
{"华为$$RRU": "RRU3775$$RRU3959$$"}//当有了华为下的儿子,就可以和儿子组合起来和成一个唯一的键,为一个字符串//
下面是获取到的整个JSON字符串
String str = {  "爱立信$$BBU$$DUS4102": "KDU137624/11$$",
				"华为$$RRU$$RRU3959$$WD5MIRUYC10E": "基带板$$",
				"factory": "华为$$爱立信$$",
				"华为": "BBU$$RRU$$",
				"爱立信$$BBU$$DUS4102$$KDU137624/11": "基带板$$",
				"华为$$BBU": "UMPTb2$$",
				"华为$$RRU": "RRU3775$$RRU3959$$",
				"华为$$RRU$$RRU3959": "WD5MIRUYC10E$$",
				"华为$$BBU$$UMPTb2": "WD22UMPTb2$$",
				"华为$$RRU$$RRU3775$$D5MPRUC19BC": "电源模块$$",
				"result": "ok",
				"华为$$BBU$$UMPTb2$$WD22UMPTb2": "射频单元$$",
				"华为$$RRU$$RRU3775": "D5MPRUC19BC$$",
				"爱立信$$BBU": "DUS4102$$",
				"爱立信$$RRU": "RRUS01B1$$",
				"爱立信$$RRU$$RRUS01B1": "KRC161255/2$$",
				"爱立信$$RRU$$RRUS01B1$$KRC161255/2": "电源模块$$",
				"爱立信": "BBU$$RRU$$"};

和android交互会出现乱码问题,大家可以使用URL编码进行编解码,在最后返回字符串的时候,加入一下代码

代码语言:javascript
复制
UrlUtil.getURLEncoderString(json.toString());//为自己的编码类
Android客户端代码
代码语言:javascript
复制
public class Main2Activity extends AppCompatActivity {
    //下拉组件
    private Spinner factorySpinner = null;   //厂商
    private Spinner typeSpinner = null;  //大类
    private Spinner products_nameSpinner = null;     //产品名称
    private Spinner products_noSpinner = null;    //产品号
    private Spinner functionSpinner = null;    //产品号
    //数据适配器
    ArrayAdapter<String> factoryAdapter = null;//
    ArrayAdapter<String> typeAdapter = null;  //
    ArrayAdapter<String> products_nameAdapter = null;    //
    ArrayAdapter<String> products_noAdapter = null;    //
    ArrayAdapter<String> functionAdapter = null;    //
    JSONObject root = null;
    static int provincePosition = 3;
    HttpClient client;
    //
    private String[] text = new String[]{"请选择"};
    private String[] factory_1 = null;
    ProgressDialog waitingDialog=null;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        waitingDialog= new ProgressDialog(Main2Activity.this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        client = new DefaultHttpClient();
        readNet(Contents.HOST+"user_info/requestproductstypeApplication.html");
        showWaitingDialog();
    }

    private void showWaitingDialog() {
        waitingDialog.setTitle("我是一个等待Dialog");
        waitingDialog.setMessage("等待中...");
        waitingDialog.setIndeterminate(true);
        waitingDialog.setCancelable(false);
        waitingDialog.show();
    }
    /*
     * 设置下拉框,默认的值,内容为请选择
     */
    private void setSpinner()
    {
        factorySpinner = (Spinner)findViewById(R.id.spin_factory);
        typeSpinner = (Spinner)findViewById(R.id.spin_type);
        products_nameSpinner = (Spinner)findViewById(R.id.spin_products_name);
        products_noSpinner = (Spinner)findViewById(R.id.spin_products_no);
        functionSpinner = (Spinner)findViewById(R.id.spin_function);

        //绑定适配器和值
        try{
            System.out.println(root.getString("factory").split("\\$\\$")[0]);
            factoryAdapter = new ArrayAdapter<String>(Main2Activity.this,
                    android.R.layout.simple_spinner_item, factory_1);
        }catch (Exception e){
          e.printStackTrace();
        }

        factorySpinner.setAdapter(factoryAdapter);
        factorySpinner.setSelection(0,true);  //设置默认选中项,此处为默认选中第4个值


        typeAdapter = new ArrayAdapter<String>(Main2Activity.this,
                android.R.layout.simple_spinner_item, text);
        typeSpinner.setAdapter(typeAdapter);
        typeSpinner.setSelection(0,true);  //默认选中第0个



        products_nameAdapter = new ArrayAdapter<String>(Main2Activity.this,
                android.R.layout.simple_spinner_item, text);
        products_nameSpinner.setAdapter(products_nameAdapter);
        products_nameSpinner.setSelection(0, true);


        products_noAdapter = new ArrayAdapter<String>(Main2Activity.this,
                android.R.layout.simple_spinner_item, text);
        products_noSpinner.setAdapter(products_noAdapter);
        products_noSpinner.setSelection(0, true);


        functionAdapter = new ArrayAdapter<String>(Main2Activity.this,
                android.R.layout.simple_spinner_item, text);
        functionSpinner.setAdapter(functionAdapter);
        functionSpinner.setSelection(0, true);
        //下拉框监听,单开始选中一个值的时候用,就分别设置每个数据适配器的值,因为有先后有顺序,所以要获取上一个的值,才能设置下一个的值

        factorySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
        {
            // 表示选项被改变的时候触发此方法,
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3)
            {
                try {
                    typeAdapter = new ArrayAdapter<String>(Main2Activity.this,
                            android.R.layout.simple_spinner_item, root.getString(factorySpinner.getItemAtPosition(position).toString()).split("\\$\\$"));
                    typeSpinner.setAdapter(typeAdapter);
                }catch (Exception e){
                    e.printStackTrace();
                }

            }
            @Override
            public void onNothingSelected(AdapterView<?> arg0)
            {

            }

        });
        typeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
        {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                                       int position, long arg3)
            {
                try {
                    products_nameAdapter = new ArrayAdapter<String>(Main2Activity.this,
                        android.R.layout.simple_spinner_item, root.getString(factorySpinner.getSelectedItem().toString()+
                        "$$"+typeSpinner.getItemAtPosition(position)).split("\\$\\$"));
                    products_nameSpinner.setAdapter(products_nameAdapter);
                }catch (Exception e){
                    e.printStackTrace();
                }


            }
            @Override
            public void onNothingSelected(AdapterView<?> arg0)
            {

            }
        });
        products_nameSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
        {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                                       int position, long arg3)
            {
                try {
                    products_noAdapter = new ArrayAdapter<String>(Main2Activity.this,
                            android.R.layout.simple_spinner_item, root.getString(factorySpinner.getSelectedItem().toString()+
                            "$$"+typeSpinner.getSelectedItem().toString()+"$$"+
                            products_nameSpinner.getItemAtPosition(position).toString()).split("\\$\\$"));
                    products_noSpinner.setAdapter(products_noAdapter);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            @Override
            public void onNothingSelected(AdapterView<?> arg0)
            {

            }
        });
        products_noSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
        {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                                       int position, long arg3)
            {
                try {
                    functionAdapter = new ArrayAdapter<String>(Main2Activity.this,
                            android.R.layout.simple_spinner_item, root.getString(factorySpinner.getSelectedItem().toString()+
                            "$$"+typeSpinner.getSelectedItem().toString()+"$$"+
                            products_nameSpinner.getSelectedItem().toString()+"$$"+
                            products_noSpinner.getItemAtPosition(position).toString()).split("\\$\\$"));
                    functionSpinner.setAdapter(functionAdapter);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            @Override
            public void onNothingSelected(AdapterView<?> arg0)
            {

            }
        });
    }
    public void readNet(String url) {
        AsyncTask<String, Void, String> execute = new AsyncTask<String, Void, String>() {

            @Override
            protected String doInBackground(String... params) {

                String urlString = params[0];
                System.out.println(urlString);
                HttpGet get = new HttpGet(urlString);
                try {
                    HttpResponse response = client.execute(get);

                    String valueString = EntityUtils.toString(response.getEntity());

                    return valueString;
                } catch (ClientProtocolException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return null;
            }

            @Override

            protected void  onPostExecute (String s) {
                try{
                    synchronized (this){
//最先开始获取顶层的数据,因为他的键值是固定的,在查询的时候不需要条件,我们设置定的为factory;            
System.out.println(UrlUtil.getURLDecoderString(s));
                        root = new JSONObject(UrlUtil.getURLDecoderString(s));
                        String result = root.getString("result");
                        String[] string = root.getString("factory").split("\\$\\$");
                        factory_1 = new String[string.length+1];
                        factory_1[0] = "请选择";
                        for (int i = 1;i<string.length+1;i++){
                            factory_1[i] = string[i-1];
                        }
//不设置其它内容对会获取不到
                        super.onPostExecute(result);
                    }
                }catch (Exception e){
                  e.printStackTrace();
                }finally {
                    waitingDialog.dismiss();
                    setSpinner();
                }
            }
        }.execute(url);

    }
}
android 下拉xml文件
代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="600dp"
    android:orientation="vertical"
    android:padding="8dp">

    <Spinner
        android:id="@+id/spin_factory"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />
    <Spinner
        android:id="@+id/spin_type"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />
    <Spinner
        android:id="@+id/spin_products_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />
    <Spinner
        android:id="@+id/spin_products_no"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />
    <Spinner
        android:id="@+id/spin_function"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

</LinearLayout>
    </LinearLayout>

好了,就这么写内容,由于当时数据库的问题,就先只能这样获取数据了,在查询上效率会面一些,但是一般不会分类太多,多的话那就是大的项目了,可以事先就存在redis中,用Zset,键值还是键,值还是值就获取的更快了。,内容有点多,可以先运行试试,看看效果或许可以在必要的时候帮助你一点。 有好的解答和疑问可以在下方评论,也可以加我的QQ:1402876003.

网页五级下拉菜单联动请在博客里寻找。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年10月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • android下拉五级菜单联动
    • 一、问题引出
      • 二、实例代码
        • 数据库建表如下:
        • java后端数据代码
        • Android客户端代码
        • android 下拉xml文件
    • 网页五级下拉菜单联动请在博客里寻找。
    相关产品与服务
    数据库
    云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档