美文网首页
Android:三级联动 Android-PickerView

Android:三级联动 Android-PickerView

作者: 皮皮铭 | 来源:发表于2019-08-22 15:44 被阅读0次
    image.png
        implementation 'com.contrarywind:Android-PickerView:4.1.8'
    

    布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <Button
            android:id="@+id/btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="打开联动" />
    
        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </LinearLayout>
    

    MainActivity

    public class MainActivity extends AppCompatActivity {
        private ArrayList<JsonBean> options1Items = new ArrayList<>(); //省
        private ArrayList<ArrayList<String>> options2Items = new ArrayList<>();//市
        private ArrayList<ArrayList<ArrayList<String>>> options3Items = new ArrayList<>();//区
        private TextView tv;
        private Button btn;
        private static final String TAG = "MainActivity";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tv = findViewById(R.id.tv);
            btn = findViewById(R.id.btn);
            initJsonData();
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    initOptionPicker();
                }
            });
        }
    
        private void initOptionPicker() {//条件选择器初始化
            /**
             * 注意 :如果是三级联动的数据(省市区等),请参照 JsonDataActivity 类里面的写法。
             */
            OptionsPickerView pvOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {
                @Override
                public void onOptionsSelect(int options1, int options2, int options3, View v) {
                    //返回的分别是三个级别的选中位置
                    tv.setText(options1Items.get(options1).getPickerViewText() + "  "
                            + options2Items.get(options1).get(options2) + "  "
                            + options3Items.get(options1).get(options2).get(options3));
                }
            })
                    .setTitleText("城市选择")
                    .setDividerColor(Color.BLACK)
                    .setTextColorCenter(Color.BLACK) //设置选中项文字颜色
                    .setContentTextSize(20)
                    .build();
            pvOptions.setPicker(options1Items, options2Items, options3Items);//三级选择器
            pvOptions.show();
    
        }
    
        //解析数据 (省市区三级联动)
        private void initJsonData() {
            String JsonData = new GetJsonDataUtil().getJson(this, "area.json");//获取assets目录下的json文件数据
            ArrayList<JsonBean> jsonBean = parseData(JsonData);//用Gson 转成实体
            /**
             * 添加省份数据
             *
             * 注意:如果是添加的JavaBean实体,则实体类需要实现 IPickerViewData 接口,
             * PickerView会通过getPickerViewText方法获取字符串显示出来。
             */
            options1Items = jsonBean;
            for (int i = 0; i < jsonBean.size(); i++) {//遍历省份
                ArrayList<String> CityList = new ArrayList<>();//该省的城市列表(第二级)
                ArrayList<ArrayList<String>> Province_AreaList = new ArrayList<>();//该省的所有地区列表(第三级)
    
                for (int c = 0; c < jsonBean.get(i).getCityList().size(); c++) {//遍历该省份的所有城市
                    String CityName = jsonBean.get(i).getCityList().get(c).getName();
                    CityList.add(CityName);//添加城市
                    ArrayList<String> City_AreaList = new ArrayList<>();//该城市的所有地区列表
                    //如果无地区数据,建议添加空字符串,防止数据为null 导致三个选项长度不匹配造成崩溃
                    if (jsonBean.get(i).getCityList().get(c).getArea() == null
                            || jsonBean.get(i).getCityList().get(c).getArea().size() == 0) {
                        City_AreaList.add("");
                    } else {
                        City_AreaList.addAll(jsonBean.get(i).getCityList().get(c).getArea());
                    }
                    Province_AreaList.add(City_AreaList);//添加该省所有地区数据
                }
                /**
                 * 添加城市数据
                 */
                options2Items.add(CityList);
    
                /**
                 * 添加地区数据
                 */
                options3Items.add(Province_AreaList);
            }
        }
    
        public ArrayList<JsonBean> parseData(String result) {//Gson 解析
            ArrayList<JsonBean> detail = new ArrayList<>();
            try {
                JSONArray data = new JSONArray(result);
                Gson gson = new Gson();
                for (int i = 0; i < data.length(); i++) {
                    JsonBean entity = gson.fromJson(data.optJSONObject(i).toString(), JsonBean.class);
                    detail.add(entity);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return detail;
        }
    }
    

    GetJsonDataUtil

    /**
     * <读取Json文件的工具类>
     */
    
    public class GetJsonDataUtil {
        public String getJson(Context context,String fileName) {
            StringBuilder stringBuilder = new StringBuilder();
            try {
                AssetManager assetManager = context.getAssets();
                BufferedReader bf = new BufferedReader(new InputStreamReader(
                        assetManager.open(fileName)));
                String line;
                while ((line = bf.readLine()) != null) {
                    stringBuilder.append(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return stringBuilder.toString();
        }
    }
    

    相关文章

      网友评论

          本文标题:Android:三级联动 Android-PickerView

          本文链接:https://www.haomeiwen.com/subject/wxnnsctx.html