IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 基于Android-PickerView的三级联动城市选择器使用 -> 正文阅读

[移动开发]基于Android-PickerView的三级联动城市选择器使用

最近在github中看到一个很不错的下拉选择器项目Android-PickerView,决定自己试一下。

首先,导入Android-PickerView包:

implementation 'com.contrarywind:Android-PickerView:3.1.0'

然后,去聚合数据申请了一个天气预报的接口,copy了相关城市数据,然后把它装到json文件中,这边避免了每次都去请求接口调用数据,当然,也可以直接在Android中使用sql-lite存储数据,我的数据部分如下:

然后,我们在Android项目app下的main文件中创建文件夹assets文件夹,把city.json文件放进去:

?

接着,我们就可以进行正常编写了,首先是编写一个CityUtils工具类,主要是为了读取城市文件json数据?:

package com.huatec.pickerviewdemo.utils;

import android.content.Context;
import android.content.res.AssetManager;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.huatec.pickerviewdemo.entity.CityBean;

import org.apache.http.util.EncodingUtils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
/**
 * 读取城市json文件数据工具
 * date:2021.06.23
 * */
public class CityUtils {
    private static final String FILE_NAME="city.json";//文件名
    //读取json文件,并转化为string字符串
    private static String readJsonFile(Context con){
        String s="";

        InputStream in=con.getClass().getClassLoader().getResourceAsStream("assets/"+FILE_NAME);
        try {
            int len=in.available();
            byte[] bytes=new byte[len];
            in.read(bytes);
            s= EncodingUtils.getString(bytes,"UTF-8");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return s;
    }
    //封装城市数据,json转list实体
    public static List<CityBean> getCityList(Context con){
        String jsonStr=readJsonFile(con);
        Gson gson=new Gson();
        Type type=new TypeToken<ArrayList<CityBean>>(){}.getType();
        List<CityBean> list=gson.fromJson(jsonStr,type);

        return list;
    }
}

这里,我们用到了CityBean类,主要是为了更好的把json内转换成object类,所以,我们需要创建CityBean类:

package com.huatec.pickerviewdemo.entity;
//城市实体类
public class CityBean {
    private String id;
    private String province;
    private String city;
    private String district;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getDistrict() {
        return district;
    }

    public void setDistrict(String district) {
        this.district = district;
    }

    @Override
    public String toString() {
        return "CityBean{" +
                "id='" + id + '\'' +
                ", province='" + province + '\'' +
                ", city='" + city + '\'' +
                ", district='" + district + '\'' +
                '}';
    }
}

然后,我们就可以去使用Android-PickerView了,首先,我们需要对城市数据进行封装,以满足选择器需要:

//部分关键代码
    private void cityPicher(){
        OptionsPickerView pvOptions = new OptionsPickerView.Builder(this, new OptionsPickerView.OnOptionsSelectListener() {
            @Override
            public void onOptionsSelect(int options1, int options2, int options3, View v) {
                //返回的分别是三个级别的选中位置
//                String tx = op1.get(options1) +"-"+
//                        op2.get(options1).get(options2);
                String chcity="";

                if(op3.get(options1).get(options2).size()!=0||op3.get(options1).get(options2)!=null){
//                    tx+="-";
//                    tx+=op3.get(options1).get(options2).get(options3);
                    chcity=op3.get(options1).get(options2).get(options3);;
                }else{
                    chcity=op2.get(options1).get(options2);
                }
                citypicker.setText(chcity);
               

            }
        })

                .setTitleText("城市选择")
                .setCancelText("取消")
                .setCancelColor(R.style.AppTheme)
                .setSubmitText("确定")
                .setContentTextSize(20)
                .setSelectOptions(25,0,2)
                .setOutSideCancelable(false)// default is true
                .build();

        pvOptions.setPicker(op1, op2, op3);//三级选择器
        pvOptions.show();
    }
    //封装数据op1、op2、op3
    private void initdata(){
           //
        List<CityBean> pro=provincelist();
        List<CityBean> city=findCitylist();

        for (CityBean prolist:pro){
            op1.add(prolist.getProvince());
            ArrayList<ArrayList<String>> disList=new ArrayList<>();
            ArrayList<String> cityList=new ArrayList<>();
            for (CityBean cityl:city){
                if(prolist.getProvince().equals(cityl.getProvince())){
                    cityList.add(cityl.getCity());
                    ArrayList<String> disstr=new ArrayList<>();
                    for (CityBean cl:citylist){
                        if (cityl.getCity().equals(cl.getCity())&&(!cl.getDistrict().equals(cl.getCity()))){
                            disstr.add(cl.getDistrict());
                        }
                    }
                    disList.add(disstr);
                }


            }
            op2.add(cityList);
            op3.add(disList);

        }


    }
    //获取省
    private List<CityBean> provincelist(){
        List<CityBean> list=new ArrayList<>(citylist);

        for (int i=0;i<list.size();i++){
               for (int j=i+1;j<list.size();j++){
                   if(list.get(i).getProvince().equals(list.get(j).getProvince())){
                       list.remove(j);
                       j--;
                   }
               }
        }
        return list;
    }
    //获取市
    private List<CityBean> findCitylist(){
        List<CityBean> list=new ArrayList<>(citylist);

        for (int i=0;i<list.size();i++){
            for (int j=i+1;j<list.size();j++){
                if(list.get(i).getCity().equals(list.get(j).getCity())){
                    list.remove(j);
                    j--;
                }
            }
        }
        return list;
    }

具体效果:

如果对于?Android-PickerView或者代码有疑问的地方,可以搜索Android-PickerView或者加QQ群:1039603877进行交流。

-------------------------------------------------------------------------

QQ群:1039603877,本群创建于2020/2/3: ?本群原为1999人大群,主要是进行java开发技术交流,里面有重庆等地区java开发的业界大佬、牛人,很多群友都是CTO或者技术负责人。欢迎大家进群学习和交流

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 23:02:17  更:2021-07-22 23:02:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 5:26:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码