1. 程式人生 > >Android 三級列表

Android 三級列表

最近專案有用到一個三級列表,本想自己的寫,問了下度娘發現已經有大神寫好的。所以拿來藉此一用了。
為了以後的方便使用就把他封裝成一個工具類:

新增依賴:
//三級列表
compile ‘com.contrarywind:Android-PickerView:4.1.5’

  1. 首先我們要建立一個assets(網路獲取的話不需要)資料夾
    這裡寫圖片描述

2:我將三級列表的解析,資料來源都寫在一個公用類裡面,用的時候直接調該類:

package util;

import android.content.Context;
import android.content.res.AssetManager;
import
android.graphics.Color; import android.view.View; import android.widget.Toast; import com.bigkoo.pickerview.builder.OptionsPickerBuilder; import com.bigkoo.pickerview.listener.OnOptionsSelectListener; import com.bigkoo.pickerview.view.OptionsPickerView; import com.google.gson.Gson; import java.io.BufferedReader; import
java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import bean.JsonBean; import reapiractivity.ReparidetailActivity; /** * <讀取Json檔案的工具類> * */ public class `GetJsonDataUtil` { private static ArrayList<JsonBean> options1Items = new ArrayList<>();//第一級資料來源
private static ArrayList<ArrayList<String>> options2Items = new ArrayList<>();//第二級資料來源 private static ArrayList<ArrayList<ArrayList<String>>> options3Items = new ArrayList<>(); private static String mTx; 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(); } public static ArrayList<JsonBean> parseData(Context context,String result) {//Gson 解析 ArrayList<JsonBean> detail = new ArrayList<>(); try { org.json.JSONArray data = new org.json.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; } public boolean initJsonData(final Context context) {//解析資料 /** * 注意:assets 目錄下的Json檔案僅供參考,實際使用可自行替換檔案 * 關鍵邏輯在於迴圈體 * * */ String JsonData = new GetJsonDataUtil().getJson(context, "province.json");//獲取assets目錄下的json檔案資料 ArrayList<JsonBean> jsonBean = GetJsonDataUtil.parseData(context,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); } OptionsPickerView pvOptions = new OptionsPickerBuilder(context, new OnOptionsSelectListener() { @Override public void onOptionsSelect(int options1, int options2, int options3, View v) { //返回的分別是三個級別的選中位置 mTx = options2Items.get(options1).get(options2) + options3Items.get(options1).get(options2).get(options3); GetJsonDataUtil.this. onOptionsSelect(mTx); } }) .setTitleText("選擇區域") .setDividerColor(Color.BLACK) .setTextColorCenter(Color.BLACK) //設定選中項文字顏色 .setContentTextSize(20) .build(); pvOptions.setPicker(options1Items, options2Items, options3Items);//三級選擇器 pvOptions.show(); return true; } public void onOptionsSelect(String data) { } }

3:在你需要的地方呼叫該類丟擲的方法:

 GetJsonDataUtil getJsonDataUtil = new GetJsonDataUtil(){
                    @Override
                    public void onOptionsSelect(String data) {
                        mTextzhan.setText(data);//選中後回傳的值
                    }
                };