一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Android省市区三级联动控件使用方法实例讲解

时间:2017-01-05 编辑:简简单单 来源:一聚教程网

 最近有需求需要实现省市区三级联动,但是发现之前的实现不够灵活,自己做了一些优化。为了方便以后使用,抽离出来放在了github上WheelView。同时把其核心库放在了JCenter中了,可以直接引用。也可以参考项目中的Demo进行引用

  下面介绍一下如何使用

  如果用的是AndroidStudio那么直接在build.gradle文件中添加依赖:

 
 代码如下 复制代码
dependencies {
 compile'chuck.WheelItemView:library:1.0.1'
 }
 

  成功引入库之后,可以在需要弹出省市区选择框的页面生成一AddressPickerView 实例。   

 代码如下 复制代码
pickerView =newAddressPickerView(this);

  下面来说说需要的数据源,我对数据做了抽象,在使用的时候,将自己的数据model实现IWheelViewModel接口就可以了,如下:

 
 代码如下 复制代码
publicclassAddressModelimplementsIWheelViewModel {
 publicString addressName;
 publicString addressId;
 @Override
 publicString getValueString() {
  returnaddressName;
 }
 @Override
 publicString getValueId() {
  returnaddressId;
 }
}
 

  而后,就是讲你自己从服务器或者本地数据库得到到的数据按照一定的格式组件成三级数据List,这里可能会有一点复杂,需要在组装的过程中小心一定,省市区要对应不然数据会错乱。组装数据源,最后得到省市区对应的List:   

 
 代码如下 复制代码
privateList mOneItems =newArrayList<>();
privateList> mTwoItems;
privateList>> mThreeItems;
 

  将数据源填充到View中:

//设置三级数据
 代码如下 复制代码
  pickerView.setPickerData(mOneItems, mTwoItems, mThreeItems,true);

  给确定和关闭按钮设置监听:   

 
 代码如下 复制代码
pickerView.setOnPickerSelectListener(newOnPickerSelectListener() {
   @Override
   publicvoidonSelect(intpos1,intpos2,intpos3) {
    String resultOne, resultTwo, resultThree;
    resultOne = mOneItems.get(pos1).getValueString();
    resultTwo = mTwoItems.get(pos1).get(pos2).getValueString();
    resultThree = mThreeItems.get(pos1).get(pos2).get(pos3).getValueString();
    Toast.makeText(MainActivity.this, resultOne + resultTwo + resultThree, Toast.LENGTH_SHORT).show();
   }
  });
  pickerView.setOnDismissListener(newOnDismissListener() {
   @Override
   publicvoidonDismiss(Object o) {
   }
  });
 

  如果不做特殊的设置,选中字体和非中字体都有默认的颜色和大小,如果想改变这些属性,我也在AddressPickerView中提供了对应的方法:   

/**
  * 被选中Item的字体大小
  *
  * @param size
  */
 publicvoidsetSelectTextSize(intsize)
 /**
  * 被选中Item字体颜色
  *
  * @param color
  */
 publicvoidsetSelectTextColor(intcolor)
 /**
  * 被选中Item的字体大小
  *
  * @param size dimen中定义的Size大小
  */
 publicvoidsetUnselectTextSize(intsize)
 /**
  * 被选中Item字体颜色
  *
  * @param colorId
  */
 publicvoidsetUnselectTextColor(intcolorId)

  设置完这些属性之后,直接调用show()方法就可以弹出这个选择框了。 

  完整的代码:   

 
 代码如下 复制代码
publicclassMainActivityextendsAppCompatActivity {
 AddressPickerView pickerView;
 privateList mOneItems =newArrayList<>();
 privateList> mTwoItems;
 privateList>> mThreeItems;
 @Override
 protectedvoidonCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  initData();
  //创建实例
  pickerView =newAddressPickerView(this);
  //设置title
  pickerView.setTitle("收货地址");
  //设置被选中文字的颜色
  pickerView.setSelectTextColor(R.color.green);
  pickerView.setSelectTextSize(R.dimen.select_text_size);
  pickerView.setUnselectTextColor(R.color.address_view_confirm_text_color);
  pickerView.setUnselectTextSize(R.dimen.unselect_text_size);
  //设置三级数据
  pickerView.setPickerData(mOneItems, mTwoItems, mThreeItems,true);
  //设置确定和关闭监听
  pickerView.setOnPickerSelectListener(newOnPickerSelectListener() {
   @Override
   publicvoidonSelect(intpos1,intpos2,intpos3) {
    String resultOne, resultTwo, resultThree;
    resultOne = mOneItems.get(pos1).getValueString();
    resultTwo = mTwoItems.get(pos1).get(pos2).getValueString();
    resultThree = mThreeItems.get(pos1).get(pos2).get(pos3).getValueString();
    Toast.makeText(MainActivity.this, resultOne + resultTwo + resultThree, Toast.LENGTH_SHORT).show();
   }
  });
  pickerView.setOnDismissListener(newOnDismissListener() {
   @Override
   publicvoidonDismiss(Object o) {
   }
  });
 }
 privatevoidinitData() {
  AddressModel model =newAddressModel();
  model.addressName ="北京";
  mOneItems.add(model);
  AddressModel model1 =newAddressModel();
  model1.addressName ="湖北";
  mOneItems.add(model1);
  AddressModel model2 =newAddressModel();
  model2.addressName ="河北";
  mOneItems.add(model2);
  mTwoItems =newArrayList<>();
  List l21 =newArrayList<>();
  AddressModel model21 =newAddressModel();
  model21.addressName ="北京市";
  l21.add(model21);
  List l22 =newArrayList<>();
  AddressModel model221 =newAddressModel();
  model221.addressName ="武汉";
  AddressModel model222 =newAddressModel();
  model222.addressName ="襄阳";
  AddressModel model223 =newAddressModel();
  model223.addressName ="十堰";
  AddressModel model224 =newAddressModel();
  model224.addressName ="孝感";
  AddressModel model225 =newAddressModel();
  model225.addressName ="荆州";
  l22.add(model221);
  l22.add(model222);
  l22.add(model223);
  l22.add(model224);
  l22.add(model225);
  List l23 =newArrayList<>();
  AddressModel model231 =newAddressModel();
  model231.addressName ="石家庄";
  AddressModel model232 =newAddressModel();
  model232.addressName ="邯郸";
  AddressModel model233 =newAddressModel();
  model233.addressName ="秦皇岛";
  AddressModel model234 =newAddressModel();
  model234.addressName ="保定";
  AddressModel model235 =newAddressModel();
  model235.addressName ="张家口";
  l23.add(model231);
  l23.add(model232);
  l23.add(model233);
  l23.add(model234);
  l23.add(model235);
  mTwoItems.add(l21);
  mTwoItems.add(l22);
  mTwoItems.add(l23);
  mThreeItems =newArrayList<>();
  List l31 =newArrayList<>();
  for(inti =0; i <10; i++) {
   AddressModel model3 =newAddressModel();
   model3.addressName ="北京市"+ i;
   l31.add(model3);
  }
  List> list21 =newArrayList<>();
  list21.add(l31);
  mThreeItems.add(list21);
  for(intk =0; k <2; k++) {
   List> temp =newArrayList<>();
   for(intj =0; j <5; j++) {
    List temp1 =newArrayList<>();
    for(inti =0; i <10; i++) {
     AddressModel model111 =newAddressModel();
     model111.addressName ="地区"+ i;
     temp1.add(model111);
    }
    temp.add(temp1);
   }
   mThreeItems.add(temp);
  }
 }
 publicvoidonClick(View view) {
  pickerView.show();
 }
}
 

  这些代码可以参考demo,实际上,这里只是实现了省市区的三级联动,还可以自己参考AddressPickerView定制自己想要的滚动选择框。这里只讨论省市区这种场景,其他的场景可以自己实现。

  如果觉得有用,欢迎star,如果觉得有问题,欢迎给出建议。

  https://github.com/hgchenkai/WheelView

热门栏目