栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android实现四级联动地址选择器

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android实现四级联动地址选择器

本文实例为大家分享了Android实现四级联动地址选择器的具体代码,供大家参考,具体内容如下

效果如下:

代码传送阵:

address_selector.xml



  

    

    

    

    

    

    

    

    
  

AddressDialog.java

public class AddressDialog extends DialogFragment {
  @BindView(R.id.textViewProvince)
  TextView textViewProvince;
  @BindView(R.id.textViewCity)
  TextView textViewCity;
  @BindView(R.id.textViewArea)
  TextView textViewArea;
  @BindView(R.id.textViewStreet)
  TextView textViewStreet;
  @BindView(R.id.iv_close)
  AppCompatImageView ivClose;
  @BindView(R.id.indicator)
  View indicator;
  @BindView(R.id.divider)
  View divider;
  @BindView(R.id.recycler_view)
  RecyclerView recyclerView;
  @BindView(R.id.cl_container)
  ConstraintLayout clContainer;
  @BindView(R.id.ll_container)
  LinearLayout llContainer;
  Unbinder unbinder;
  private CompositeDisposable compositeDisposable = new CompositeDisposable();
  private float measuredHeight = 0F;
  // 当前tab 0省1市2区
  private int currentTab = 0;
  // 省
  private ArrayList proviceList = new ArrayList<>();
  // 市
  private ArrayList cityList = new ArrayList<>();
  private ConcurrentHashMap> cityMap = new ConcurrentHashMap<>();
  // 区
  private ArrayList areaList = new ArrayList<>();
  private ConcurrentHashMap> areaMap = new ConcurrentHashMap<>();
  //街道
  private ArrayList streetList = new ArrayList<>();
  private ConcurrentHashMap> streetMap = new ConcurrentHashMap<>();

  private baseQuickAdapter mAdapter;
  private onSelectListener listener;
  private String textProvince = "";
  private String textCity = "";
  private String textarea = "";
  private String textStreet = "";
  private ProgressDialog mProgressDialog;
  @Nullable
  @Override
  public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.address_selector, container, false);
    unbinder = ButterKnife.bind(this, view);
    return view;
  }

  @Override
  public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, R.style.Style_Dialog_Transparent);
  }

  @Override
  public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    textViewProvince.setSelected(true);
    float measureText = textViewProvince.getPaint().measureText("请选择");
    indicator.getLayoutParams().width = (int) measureText;
    LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)clContainer.getLayoutParams();
    layoutParams.topMargin = listener.getHeight() == 0 ? UIUtil.dip2px(MyApplication.applicationContext,180f) :listener.getHeight();
    clContainer.setLayoutParams(layoutParams);
    initData();
    initClick();

    ViewUtils.postMeasured(clContainer, new Runnable() {
      @Override
      public void run() {
 llContainer.animate().alpha(1f).setDuration(150).start();

 float measuredHeight = (float)clContainer.getMeasuredHeight();
 ObjectAnimator translationY = ObjectAnimator.ofFloat(clContainer, "translationY", measuredHeight, 0f);
 translationY.setDuration(150);
 translationY.setInterpolator(new LinearInterpolator());
 translationY.start();
      }
    });

  }

  private void initData() {
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    mAdapter=new baseQuickAdapter(R.layout.item_area) {
      @Override
      protected void convert(@NonNull baseViewHolder helper, final County item) {
 helper.setText(R.id.textView,item.name);
 helper.getConvertView().setonClickListener(new View.onClickListener() {
   @Override
   public void onClick(View v) {
     switch (currentTab) {
case 0:
  getCityList(new Consumer>() {
    @Override
    public void accept(ArrayList counties) throws Exception {
      // 本地是否存在
      if (cityMap.containsKey(item.code)){
 ArrayList list = cityMap.get(item.code);
 if (list==null) {
   list=new ArrayList<>();
 }
 notifyAdapter(list);
      }else {
 for (County next : cityList) {
   if (cityMap.containsKey(item.code) && item.code.equals(next.provinceCode)) {
     ArrayList list = cityMap.get(item.code);
     if (list != null) {
list.add(next);
cityMap.put(next.provinceCode, list);
     }
   } else {
     @SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
     ArrayList listCounty = new ArrayList<>();
     listCounty.add(next);
     cityMap.put(next.provinceCode, listCounty);
   }
 }
      }
      ArrayList list = cityMap.get(item.code);
      notifyAdapter(list);
    }
  });
  break;
case 1:
  getAreaList(new Consumer>() {
    @SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
    @Override
    public void accept(ArrayList list) throws Exception {
      if (areaMap.containsKey(item.code)) {
 ArrayList arrayList = areaMap.get(item.code);
 if (arrayList==null) {
   arrayList =new ArrayList<>();
 }
 notifyAdapter(arrayList);
      }else {
 for (County county : areaList) {
   if (areaMap.containsKey(item.code) && item.code.equals(county.cityCode)) {
     ArrayList countyArrayList = areaMap.get(item.code);
     if (countyArrayList != null) {
countyArrayList.add(county);
areaMap.put(county.code, countyArrayList);
     }
   }else {
     ArrayList arrayList = new ArrayList<>();
     arrayList.add(county);
     areaMap.put(county.cityCode,arrayList);
   }
 }
      }
      ArrayList arrayList = areaMap.get(item.code);
      notifyAdapter(arrayList);
    }
  });
  break;
case 2:

  if (mProgressDialog == null) {
    mProgressDialog = new ProgressDialog(getActivity());
  }

  mProgressDialog.setCanceledonTouchOutside(false);
  mProgressDialog.setCancelable(true);
  mProgressDialog.show();

  getStreetList(new Consumer>() {
    @Override
    public void accept(ArrayList list) throws Exception {

      if (streetMap.containsKey(item.code)) {
 ArrayList arrayList = streetMap.get(item.code);
 if (arrayList==null) {
   arrayList =new ArrayList<>();
 }
 notifyAdapter(arrayList);
      }else {
 for (County county : streetList) {
   if (streetMap.containsKey(item.code) && item.code.equals(county.areaCode)) {
     ArrayList countyArrayList = streetMap.get(item.code);
     if (countyArrayList != null) {
countyArrayList.add(county);
streetMap.put(county.code, countyArrayList);
     }
   }else {
     ArrayList arrayList = new ArrayList<>();
     arrayList.add(county);
     streetMap.put(county.areaCode,arrayList);
   }
 }
      }
      ArrayList arrayList = streetMap.get(item.code);
      notifyAdapter(arrayList);

      if (mProgressDialog != null) {
 ThreadHelper.getInstance().runonUiPostDelayed(new Runnable() {
   @Override
   public void run() {
     mProgressDialog.dismiss();
   }
 },1000);

      }
    }
  });
     }

     upTabStatus(item.name);
     indicatorAnim();
   }
 });

      }
    };

    recyclerView.setAdapter(mAdapter);
    getProvinceList(new Consumer>() {
      @Override
      public void accept(ArrayList list) throws Exception {
 notifyAdapter(proviceList);
      }
    });
  }


  private void initClick() {
    ivClose.setonClickListener(new View.onClickListener() {
      @Override
      public void onClick(View v) {
 closeDialog();
      }
    });

    llContainer.setonClickListener(new View.onClickListener() {
      @Override
      public void onClick(View v) {
 closeDialog();
      }
    });

  }

  private void notifyAdapter(ArrayList list){
    mAdapter.getData().clear();
    mAdapter.addData(list);
  }

  //indicator 动画
  private void indicatorAnim(){
    switch (currentTab){
      case 1:
 float text = textViewProvince.getPaint().measureText(textProvince);
 indicator.animate().translationX(text+UIUtil.dip2pxf(Objects.requireNonNull(getContext()),21f)).setDuration(200).start();
 break;
      case 2:
 float measureText = textViewProvince.getPaint().measureText(textProvince);
 float measureText1 = textViewCity.getPaint().measureText(textCity);
 indicator.animate().translationX(measureText+measureText1+UIUtil.dip2pxf(Objects.requireNonNull(getContext()),42f)).setDuration(200).start();
 break;
      case 3:
 float measure = textViewProvince.getPaint().measureText(textProvince);
 float measure1 = textViewCity.getPaint().measureText(textCity);
 float measure2 = textViewArea.getPaint().measureText(textarea);
 indicator.animate().translationX(measure+measure1+measure2+UIUtil.dip2pxf(Objects.requireNonNull(getContext()),63f)).setDuration(200).start();

    }
  }

  private void upTabStatus(String name){
    switch (currentTab){
      case 0:
 textProvince=name;
 textViewProvince.setText(name);
 textViewCity.setVisibility(View.VISIBLE);
 currentTab =1;
 break;
      case 1:
 textCity=name;
 textViewCity.setText(name);
 textViewArea.setVisibility(View.VISIBLE);
 currentTab =2;
 break;
      case 2:
 textarea=name;
 textViewArea.setText(name);
 textViewStreet.setVisibility(View.VISIBLE);
 currentTab=3;
 break;
      case 3:
 textStreet=name;
 textViewStreet.setText(name);
 dismissAllowingStateLoss();
 break;

    }
    textViewProvince.setSelected(currentTab==0);
    textViewCity.setSelected(currentTab==1);
    textViewArea.setSelected(currentTab==2);
    textViewStreet.setSelected(currentTab==3);
  }

  private void getProvinceList(Consumer> consumer){
    Disposable subscribe1 = Observable.create((new ObservableonSubscribe() {
      public final void subscribe(@NonNull ObservableEmitter it) {
 if (proviceList.isEmpty()) {
   String json = getJson("address/provinces.json", getContext());
   ArrayList list = fromJson(json,new TypeToken>(){}.getType());
   if (list==null) {
     list =new ArrayList<>();
   }
   proviceList.addAll(list);
 }

 if (!proviceList.isEmpty()) {
   it.onNext(proviceList);
 }
      }
    })).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).subscribe(consumer, new Consumer() {
      @Override
      public void accept(Throwable throwable) throws Exception {

      }
    });
    compositeDisposable.add(subscribe1);
  }

  private void getCityList(Consumer> consumer){
    Disposable subscribe1 = Observable.create((new ObservableonSubscribe() {
      public final void subscribe(@NonNull ObservableEmitter it) {
 if (cityList.isEmpty()) {
   String json = getJson("address/cities.json", getContext());
   ArrayList list = fromJson(json,new TypeToken>(){}.getType());
   if (list==null) {
     list =new ArrayList<>();
   }
   cityList.addAll(list);
 }

 if (!cityList.isEmpty()) {
   it.onNext(cityList);
 }
      }
    })).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).subscribe(consumer, new Consumer() {
      @Override
      public void accept(Throwable throwable) throws Exception {

      }
    });

    compositeDisposable.add(subscribe1);
  }

  private void getAreaList(Consumer> consumer){
    Disposable subscribe1 = Observable.create((new ObservableonSubscribe() {
      public final void subscribe(@NonNull ObservableEmitter it) {
 if (areaList.isEmpty()) {
   String json = getJson("address/areas.json", getContext());
   ArrayList list = fromJson(json,new TypeToken>(){}.getType());
   if (list==null) {
     list =new ArrayList<>();
   }
   areaList.addAll(list);
 }

 if (!areaList.isEmpty()) {
   it.onNext(areaList);
 }
      }
    })).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).subscribe(consumer, new Consumer() {
      @Override
      public void accept(Throwable throwable) throws Exception {

      }
    });
    compositeDisposable.add(subscribe1);
  }

  private void getStreetList(Consumer> consumer){
    Disposable subscribe1 = Observable.create((new ObservableonSubscribe() {
      public final void subscribe(@NonNull ObservableEmitter it) {
 if (streetList.isEmpty()) {
   String json = getJson("address/streets.json", getContext());
   ArrayList list = fromJson(json,new TypeToken>(){}.getType());
   if (list==null) {
     list =new ArrayList<>();
   }
   streetList.addAll(list);
 }

 if (!streetList.isEmpty()) {
   it.onNext(streetList);
 }
      }
    })).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).subscribe(consumer, new Consumer() {
      @Override
      public void accept(Throwable throwable) throws Exception {

      }
    });
    compositeDisposable.add(subscribe1);

  }


  public String getJson(String fileName, Context context) {
    StringBuilder stringBuilder = new StringBuilder();
    try {
      InputStream is = context.getAssets().open(fileName);
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
      String line;
      while ((line = bufferedReader.readLine()) != null) {
 stringBuilder.append(line);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }

    return stringBuilder.toString();
  }


  @Nullable
  public  T fromJson(String json, Type typeOfT) {
    try {
      return initGson().fromJson(json, typeOfT);
    } catch (JsonSyntaxException e) {
      e.printStackTrace();
    }
    return null;
  }


  private Gson initGson(){
    GsonBuilder gsonBuilder = new GsonBuilder();
    try {
      Class builder = gsonBuilder.getClass();
      Field f = builder.getDeclaredField("instanceCreators");
      f.setAccessible(true);
      Map> val = (Map>) f.get(gsonBuilder);//得到此属性的值
      //注册数组的处理器
      ConstructorConstructor constructorConstructor = new ConstructorConstructor(val);
//      gsonBuilder.registerTypeAdapterFactory(new ReflectiveTypeAdapterFactory(constructorConstructor, FieldNamingPolicy.IDENTITY,
//   Excluder.DEFAULT,new JsonAdapterAnnotationTypeAdapterFactory(constructorConstructor)));
      gsonBuilder.registerTypeAdapterFactory(new MapTypeAdapterFactory(constructorConstructor,false));
      gsonBuilder.registerTypeAdapterFactory(new CollectionTypeAdapterFactory(constructorConstructor));
//      gsonBuilder.registerTypeAdapter(String.class,new StringTypeAdapter());
      gsonBuilder.registerTypeAdapter(int.class,new IntegerTypeAdapter());
      gsonBuilder.registerTypeAdapter(Integer.class,new IntegerTypeAdapter());
//      gsonBuilder.registerTypeAdapter(long.class,new LongTypeAdapter());
//      gsonBuilder.registerTypeAdapter(Long.class,new LongTypeAdapter());
//      gsonBuilder.registerTypeAdapter(double.class,new DoubleTypeAdapter());
//      gsonBuilder.registerTypeAdapter(Double.class,new DoubleTypeAdapter());
//      gsonBuilder.registerTypeAdapter(boolean.class,new BooleanTypeAdapter());
//      gsonBuilder.registerTypeAdapter(Boolean.class,new BooleanTypeAdapter());
//      gsonBuilder.registerTypeAdapter(float.class,new FloadTypeAdapter());
//      gsonBuilder.registerTypeAdapter(Float.class,new FloadTypeAdapter());

    } catch (NoSuchFieldException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    }
    return gsonBuilder.enableComplexMapKeySerialization().create();
  }


  public void closeDialog() {
      clContainer.animate().translationY(measuredHeight).setDuration(150).withEndAction(new Runnable() {
 @Override
 public void run() {
   dismissAllowingStateLoss();
 }
      }).start();
  }


  public void dismissAllowingStateLoss() {
    super.dismissAllowingStateLoss();
    if (!TextUtils.isEmpty(textProvince) && !TextUtils.isEmpty(textCity) && !TextUtils.isEmpty(textarea)&&!TextUtils.isEmpty(textStreet)) {
      listener.onSelect(textProvince, textCity, textCity,textStreet);
    }
    listener.isMissing();
    compositeDisposable.dispose();
  }


  public void setonSelectListener(onSelectListener listener) {
    this.listener = listener;
  }

  public void setHeight(int top) {

  }

  @Override
  public void onDestroyView() {
    super.onDestroyView();
    unbinder.unbind();
  }

  public interface onSelectListener {
    int getHeight();

    void onSelect(String province, String city, String area,String street);

    void isMissing();
  }

}

使用方法

private void addressDialog() {
    AddressDialog addressDialog =new AddressDialog();
    addressDialog.setonSelectListener(new AddressDialog.onSelectListener() {
      @Override
      public int getHeight() {
 return 0;
      }

      @SuppressLint("SetTextI18n")
      @Override
      public void onSelect(String province, String city, String area, String street) {
 tvPositionRtrCommunity.setText(province+" "+city+" "+area+" "+street);
      }

      @Override
      public void isMissing() {
 isShowDialog = true;
      }
    });
    addressDialog.show(getSupportFragmentManager(),AddressDialog.class.getSimpleName());
}

资源下载:四级联动地址选择器

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/153737.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号