SoFunction
Updated on 2025-03-11

Android PickerView achieves three-level linkage effect

GitHub has an open source control PickerView, which can achieve three-level linkage effect. Although this control is very simple to use, it is extremely cumbersome to fill data. Demos on GitHub are filled one by one when filling data, and the code is too redundant. Here is a simple way to implement it.

(1) Create a new assets folder in the app directory and copy the province_data.xml file to the folder. The XML file saves the address data of provinces, cities and counties across the country.

(2) Use SAX to parse the data in the xml file and fill the data into the PickerView control.

—ProvinceModel—

public class ProvinceModel implements IPickerViewData
{
  private String name;
  private List<CityModel> cityList;

  public ProvinceModel()
  {
    super();
  }

  public String getName()
  {
    return name;
  }

  public void setName(String name)
  {
     = name;
  }

  public List<CityModel> getCityList()
  {
    return cityList;
  }

  public void setCityList(List<CityModel> cityList)
  {
     = cityList;
  }

  @Override
  public String getPickerViewText()
  {
    return name;
  }
}

—CityModel—

public class CityModel implements IPickerViewData
{
  private String name;
  private List<DistrictModel> districtList;

  public CityModel()
  {
    super();
  }

  public String getName()
  {
    return name;
  }

  public void setName(String name)
  {
     = name;
  }

  public List<DistrictModel> getDistrictList()
  {
    return districtList;
  }

  public void setDistrictList(List<DistrictModel> districtList)
  {
     = districtList;
  }

  @Override
  public String toString()
  {
    return name;
  }

  @Override
  public String getPickerViewText()
  {
    return name;
  }
}

—DistrictModel—

public class DistrictModel implements IPickerViewData
{
  private String name;
  private String zipcode;

  public DistrictModel()
  {
    super();
  }

  public String getZipcode()
  {
    return zipcode;
  }

  public void setZipcode(String zipcode)
  {
     = zipcode;
  }

  public String getName()
  {
    return name;
  }

  public void setName(String name)
  {
     = name;
  }

  @Override
  public String toString()
  {
    return name;
  }

  @Override
  public String getPickerViewText()
  {
    return name;
  }
}

—XmlParserHandler—

public class XmlParserHandler extends DefaultHandler
{
  /**
    * Store all parsed objects
    */
  private List&lt;ProvinceModel&gt; provinceList = new ArrayList&lt;&gt;();
  private ProvinceModel provinceModel = new ProvinceModel();
  private CityModel cityModel = new CityModel();
  private DistrictModel districtModel = new DistrictModel();

  public XmlParserHandler(){}

  public List&lt;ProvinceModel&gt; getDataList()
  {
    return provinceList;
  }

  @Override
  public void startDocument() throws SAXException
  {
    ();
  }

  @Override
  public void endDocument() throws SAXException
  {
    ();
  }

  @Override
  public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
  {
    if (("province"))
    {
      provinceModel = new ProvinceModel();
      ((0));
      (new ArrayList&lt;CityModel&gt;());
    }
    else if (("city"))
    {
      cityModel = new CityModel();
      ((0));
      (new ArrayList&lt;DistrictModel&gt;());
    }
    else if (("district"))
    {
      districtModel = new DistrictModel();
      ((0));
      ((1));
    }
  }

  @Override
  public void endElement(String uri, String localName, String qName) throws SAXException
  {
    if(("district"))
    {
      ().add(districtModel);
    }
    else if(("city"))
    {
      ().add(cityModel);
    }
    else if(("province"))
    {
      (provinceModel);
    }
  }

  @Override
  public void characters(char[] ch, int start, int length) throws SAXException
  {
    (ch, start, length);
  }
}

public class AddressAddActivity extends BaseActivity
{
  private OptionsPickerView mCityPickerView;
  private ArrayList&lt;ProvinceModel&gt; mProvinces = new ArrayList&lt;&gt;();
  private ArrayList&lt;ArrayList&lt;CityModel&gt;&gt; mCities = new ArrayList&lt;&gt;();
  private ArrayList&lt;ArrayList&lt;ArrayList&lt;DistrictModel&gt;&gt;&gt; mDistricts = new ArrayList&lt;&gt;();

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState)
  {
    (savedInstanceState);
    supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(.activity_address_add);
    (this);
    init();
  }

  private void init()
  {
    initProvinceDatas();
    try
    {
      //Option selector      mCityPickerView = new OptionsPickerView(this);
      ( mProvinces, mCities, mDistricts, true);
      ("Choose a city");
      (false, false , false);
      (new () {
        @Override
        public void onOptionsSelect(int options1, int option2, int options3)
        {
          String address = (options1).getName() + " "
              + (options1).get(option2) + " "
              + (options1).get(option2).get(options3);
          (address);
        }
      });
    }
    catch (Exception e)
    {
      ();
    }
  }

  @OnClick(.ll_city_picker)
  public void showpickerView(View view)
  {
    ();
  }

  protected void initProvinceDatas()
  {
    AssetManager asset = getAssets();
    try
    {
      InputStream input = ("province_data.xml");
      SAXParserFactory spf = ();
      SAXParser parser = ();
      XmlParserHandler handler = new XmlParserHandler();
      (input , handler);
      ();
      //Get parsed data      mProvinces = (ArrayList&lt;ProvinceModel&gt;) ();
    }
    catch (Throwable e)
    {
      ();
    }

    if (mProvinces != null)
    {
      for (ProvinceModel p : mProvinces)
      {
        List&lt;CityModel&gt; cities = ();
        //Assemble city data        ((ArrayList&lt;CityModel&gt;) cities);
        ArrayList&lt;ArrayList&lt;DistrictModel&gt;&gt; dts = new ArrayList&lt;&gt;();
        for (CityModel c : cities)
        {
          List&lt;DistrictModel&gt; districts = ();
          ((ArrayList&lt;DistrictModel&gt;) districts);
        }
        (dts);
      }
    }
  }
}

This is a very simple example.

The above is all the content of this article. I hope it will be helpful to everyone's study and I hope everyone will support me more.